Потомки Ruby: Mirah, Reia, Rite

декабря 23, 2010  |  Published in Ruby

ruby reia rite mirahВысокая продуктивность программиста и удовольствие от разработки — оба эти достоинства присущи языку Ruby. Matz в обоих своих интервью делал большой акцент на философию языка Ruby в результате чего другие разработчики получили напутствие: Дизайн языка для людей! Не для машин! Впервые представленный в декабре 1995 Ruby (версия 0.95) значительно преобразился и окреп со времен того первого релиза. Теперь мы имеем полдюжины альтернативных реализаций (как например JRuby, Rubinius, Maglev, Ruby EE и т.д.), десятки тысяч библиотек и, возможно, одно из самых активных сообществ разработчиков.

Однако, так как Ruby создавался не в секретных лабораториях ЦРУ, заимствуя множество идей и идеологий от Smalltalk, Lisp, Perl и других языков, то теперь он таким же образом имеет влияет на новые языки программирования, которые идут дальше простого подражания, копирования MRI; , , Rite и хорошие примеры таких новых языков. Некоторые из них разрабатываются только на бумаге, некоторые полностью экспериментальные, а некоторые реально работают и используются в продакшене. Давайте рассмотрим некоторых наиболее примечательных потомков Ruby поближе. Read the rest of this entry »

Tags: ,

Различия между Public, Protected и Private методами

декабря 19, 2010  |  Published in Ruby, Основы

Очень просто программировать несколько лет на Ruby и никогда не обращать внимание на декларирование видимости методов (прав доступа к методам) при помощи public, private и protected. Я так говорю потому, что и сам не обращал на это внимание. Я пришел в Ruby из С/C++, поэтому я отлично понимал концепцию public и private, и я догадывался о том, что собой представляет декларация protected в Ruby, но я никогда не пытался разобраться со всем этим более подробно. В конечном счете по некоторым причинам я заинтересовался этим вопросом и в этой статье я расскажу о различных декларациях видимости методов: public, protected и private.
Read the rest of this entry »

Tags:

Что делает оператор * — «звездочка» в Ruby?

декабря 8, 2010  |  Published in Ruby, Основы

ruby asterisk operatorRuby — язык, который полон сюрпризов, чаще всего приятных. Одной из интересных идиом в Ruby является унарный оператор «звездочка» - *, он же asterisk и splat. К сожалению не все умеют с ним работать и не все понимают что он делает. Мне больше всего нравится название asterisk, поэтому я буду использовать его далее по тексту.
Read the rest of this entry »

Tags:

Ruby и красивый код #4

декабря 7, 2010  |  Published in Ruby, Основы

Это относительно вольный перевод с английского статьи

ruby

Предыдущие статьи из рубрики:
Ruby и красивый код #1
Ruby и красивый код #2
Ruby и красивый код #3

Что же такое идиома?
Идиома — это что-то специфическое в языке. Идиомы Ruby — это программистские техники которые специфичны для Ruby и позволяют писать на Ruby небольшие фрагменты кода, которые, если попытаться переписать на менее лаконичном языке, потеряют свою красоту и могут превратиться во что-то монструозное.

Зачем изучать идиомы в Ruby, если можно писать код и без них?

Во-первых идиомы — это лаконичный код, а во-вторых вы ведь не сплошь и рядом пользуетесь своими велосипедами? Вы наверняка используете чужие библиотеки и rubygem’ы и плагины и читая чужой код вы наверняка наткнетесь на идиомы и техники метапрограммирования, таким образом без знания идиом языка Ruby и техник метапрограммирования вы не сможете понять чужого кода.
Read the rest of this entry »

Tags: , ,

Что нового в Ruby 1.9?

ноября 20, 2010  |  Published in Ruby, Основы

Что нового в 1.9?В этой статье автор пытается раскрыть все наиболее значительные изменения в Ruby 1.9.

Изменения в самом Ruby:

— Rubygems и Rake теперь официально являются частями Ruby и поставляются с ним в комплекте.

— Некоторые непопулярные библиотеки были исключены из ядра, однако доступны в виде RubyGems: soap, jruby и т.д.

— Новый «основной» класс в иерархии классов: BasicObject:

1.8 => [Class, Module, Object, Kernel]
1.9 => [Class, Module, Object, Kernel, BasicObject]

BasicObject.instance_methods # => [:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]

Этот класс на столько основной, что для него даже не определен метод object_id.

Read the rest of this entry »

Tags: ,

Ruby и красивый код #3

ноября 20, 2010  |  Published in Ruby

ruby
Предыдущие статьи из рубрики:
Ruby и красивый код #1
Ruby и красивый код #2

Исходя из активности комментирования последнего поста Ruby и крассивый код #2 делаю вывод о том, что рубрика действительно интересна и стоет ее развивать. По сему представляю еще 2 задачи:

Задача #1
Дан массив целых чисел. Вывести напечатать номер последнего его элемента, который удовлетворяет двойному неравенству A[0] < A[i] < A[-1]. Если такого элемента не найдено, то напечатать «[ ]«.

Read the rest of this entry »

Tags: , ,

Ruby и красивый код #2

ноября 18, 2010  |  Published in Ruby, Основы

rubyЭто 2я статья из серии «Ruby и красивый код».
Ruby и красивый код #1

Задача №1 по высокоуровневому программированию (ФГОУ ДПО МЭТТ ГАИ)
Эта задача использовались автоматизированной системой тестирования при проведении контрольных работ по предметам: «Программирование на языке высокого уровня» и «Программное обеспечение компьютерных сетей» в 2006-2007 учебном году.

Задача: Дан целочисленный массив. Необходимо вывести вначале его элементы с четными индексами, а затем — с нечетными.

Решение #1

        arr = (1..9).to_a
        indexes, p, np  = [], [], [] 
        arr.each_index{|i| indexes << i}
        for i in indexes 
          if i % 2 == 0
            p << i
          else 
            np << i
          end
        end

        for i in p
          puts arr[i]
        end
        
        puts "---"
        
        for i in np
          puts arr[i]
        end
        
        

Решение #2

        arr = (1..9).to_a

        arr.each_with_index do |elem, index|
          puts elem if (index % 2) == 0
        end

        arr.each_with_index do |elem, index|
          puts elem if (index % 2) != 0
        end
   

Решение #3 - Немного измененное решение #2

arr = (1..9).to_a
n, np = [], []

arr.each_with_index do |elem, index|
  if (index % 2) == 0
    p << elem
  else
    np << elem
  end
end
        
puts p
  puts "---"
puts np

Первое решение задачи - решение человека, не знающего о существовании метода each_with_index (мое). Второе решение - решение моего друга, который значительно более опытный програмист чем я и который знает о существовании метода each_with_index (Максим, спасибо!). Третье решение - мое, его я создал для решения некоторых недостатков решения номер 2, а именно: вместо двух обходов по массиву теперь остался лишь один, кроме того значения под парными и непарными индексами не просто выводятся на экран, но и сохраняются в соответствующие масивы p и np для возможности их дальнейшего использования.

Выводы: Первое решение можно отнести к over engineering, так как в нем слишком много кода, что связано с малым опытом работы на языке Ruby. Второй метод наиболее лаконичный и читабельный, а третий найдет большее применение.

Создаем себе Золотое правило: Прежде, чем писать код, следует убедиться в том, что метода реализующего полностью или частично необходимую функциональность, нету. Спешка и нежелание работать с документацией - большие враги программиста!

Обновление #1:
Вот придумал еще один интересный способ решения:

arr = (1..9).to_a
p, np  = [], [] 

arr.each_index do |i| 
  i%2 == 0 ? p << i : np << i
end

puts arr.values_at(*p)
puts arr.values_at(*np)

Обновление #2:
Максим предоставил еще более изящный вариант решения задачи:

arr = (1..9).to_a

even_indexes, odd_indexes = (0..(arr.size - 1)).partition  {|i| i % 2 == 0}

puts arr.values_at(*even_indexes)
puts arr.values_at(*odd_indexes)

Браво!

Tags: , ,

Ruby и красивый код #1

октября 19, 2010  |  Published in Ruby, Основы

ruby Благодаря некоторым особенностям Ruby, код на нем можно писать значительно более лаконичный, чем вы можете себе это представить. Например, благодаря тому, что Ruby возвращает значение последнего выражения, можно сократить количество кода не только за счет отказа от использования return, там, где это возможно, но и за счет написания простых методов, которые в итоге своей работы возвращают только true или false не используя при этом логический конструкций типа if..else, и т.д.
Read the rest of this entry »

Tags: ,

В чем разница между Proc и Lambda в Ruby?

октября 4, 2010  |  Published in Ruby, Основы

ruby lambda and procКонцепции Proc (сокр. От Procedure — процедура) и Lambda (Лямбда-функция) в Ruby имеют очень тонкие различия, которые новичкам могут показаться незначительными, а могут и вообще не показаться=) Этот пост — попытка продемонстрировать и объяснить эти их особенности. Read the rest of this entry »

Tags:

home_run: Рубиновые классы Date и DateTime стали в десятки раз быстрее!

августа 24, 2010  |  Published in Ruby, Ruby Gems

clock, ruby's date/datetimeHome_run – реализация рубиновых Date / DateTime классов на языке Си, с улучшенной производительностью (ускорение в десятки раз), что полностью совместима со стандартной библиотекой Ruby.
Home_run возникла стараниями Джереми Эванса, известного также по разработке Sequel. Были проведены бенчмарки на двух различных моделях Rails, что показали прирост скорости работы моделей соответственно в 2 и 3 раза.

Read the rest of this entry »

Tags: , ,