Основы

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:

Модули и Примеси в Ruby

августа 9, 2010  |  Published in Ruby, Основы

ruby modulesМодули являются отличным решением для группирования методов, классов и констант вместе.
Использую модули можно извлечь две значительные выгоды:

-Модули обеспечивают пространства имен и, следовательно, предотвращают возникающие с именованием методов, классов и констант ошибки.

-Модули реализуют примеси (mixins) — элегантное решение заменяющее множественное наследование.

Модули определяют пространства имен, песочницу в которой ваши методы и константы могут работать без возникновения проблем с другими методами и константами, которые имеют такие же имена.

Так выглядит модуль:

module Identifier
statement1
statement2
………..
end

Read the rest of this entry »

Tags: ,

Устанавливаем Ruby 1.8.7 и Ruby on Rails

июня 26, 2010  |  Published in Ruby, Ruby Gems, Ruby on Rails, Основы

railsЯ решил описать установку Ruby, RubyGems и Ruby on Rails отдельной статьей. Знаю, немножко запоздало, ведь блог ориентирован главным образом на новичков и следовало бы начать со статьи описывающей инсталляцию, но…

Установка Ruby

Прежде, чем вы сможете создать свое первое приложение на Rails, вам необходимо установить на свой компьютер Ruby, RubyGems и собственно Rails.
Read the rest of this entry »

Tags: , ,

to_hex, to_binary, to_… или преобразование систем счисления

мая 26, 2010  |  Published in Ruby, Основы

В очередной раз поражаюсь тому, на сколько Ruby интересный и изящно спроектированный язык. Например, вы  знали, что стандартными методами преобразования типов данных to_i и to_s можно преобразовывать систему счисления. Для того, чтобы было понятней приведу примеры:

puts 2.to_s(2) #=> 10
puts 11.to_s(2) #=> 1011
puts 'aa'.to_i(16) #=> 170
puts 'fe'.to_i(16) #=> 254
a = 0xff+0xee #=> 493
b= a.to_s(16) #=> 1ed
puts b
puts b.to_i(16) #=> 493
class Fixnum
        def to_hex
                "0x" << self.to_s(16)
        end
        def to_binary
                "0b" << self.to_s(2)
        end
end

puts 16.to_hex #=> 0x10
puts (16+16).to_hex #=> 0x20
puts 3.to_binary #=> 0b11 

Вы можете сами придумать любую систему счисления (пятнядцетиричную, троичную и т.д.) и написать метод для преобразования чисел по аналогии с to_hex и to_binary.

Tags: ,

Методы модуля Enumerable.

мая 24, 2010  |  Published in Ruby, Основы

Модуль Enumerable в Ruby представляет собой хранилище методов для работы с исчисляемыми типами данных: массивами, хэшами и диапазонами и включается в определение всех этих классов. Enumerable содержит огромное количество методов для работы с исчисляемыми типами и решения различных задач, в случае, если вам понадобится объявить свой метод, который будет доступен для всех исчисляемых типов, вы можете сделать это в определении модуля Enumerable:

module Enumerable
def my_method
...
end
end

Но сейчас беседа пойдет не об этом, а о том, как могут быть полезны предоставляемые модулем Enumerable методы.

В следующих примерах мы будем использовать следующий массив, который содержит названия различных транспортных средств:

vehicles = %w[ car truck boat plane helicopter bike ]

Read the rest of this entry »

Tags: ,

Богатство Ruby на циклы и итераторы

мая 6, 2010  |  Published in Ruby, Основы

loopRuby очень богат на циклы, итераторы и другие синтаксические конструкции. Очень часто изучающие Ruby тратят много времени на изучение всех этих конструкций. Этому способствует даже не так разнообразие и богатство языка Ruby, как то, что в книгах и сайтах посвященных азам программирования на языке Ruby мало внимания уделяется освещению всех способов создания циклов и итераторов как не самых интересных для изучающего частей языка.

В этой статье я познакомлю вас со всеми знакомыми мне циклами и некоторыми часто используемыми итераторами и приведу простые примеры их использования. Read the rest of this entry »

Tags: ,

Ruby ‘шные итераторы — each и collect

мая 5, 2010  |  Published in Ruby, Основы

each & collect Ruby methodsИтераторы являются не чем иным, как методами, поддерживающими коллекции. Коллекциями называются объекты, которые хранят в себе группы элементов данных. В массивы и хэши в Ruby также могут называться коллекциями, поскольку полностью соответствую вышеописанному определению коллекций.
Итераторы – это методы, которые последовательно проходят по всем элементам коллекции (массива или хэша) при этом выполняя над ними определенные операции. В этой статье мы рассмотрим два итератора – это итераторы each и collect. Давайте приступим! Read the rest of this entry »

Tags: ,

Эти загадочные True, False и Nil объекты Ruby

мая 4, 2010  |  Published in Ruby, Основы

true Каждое выражение и каждый объект в Ruby имеет булево значение, что означает, что каждый объект и каждое выражение оцениваются как true или как false. Это делает true и false довольно специфическими значениями в языке Ruby. При всем при этом, true и false являются не просто значениями, а объектами Ruby.

Объекты True и False

Вы, наверняка, знаете, что true и false — это зарезервированные слова Ruby, что означает, что вы не сможете использовать их как имена для переменных или методов. Но помимо этого, оба true и false также являются абсолютно полноценными объектами. Ruby имеет 2 специальных класса от которых происходят эти объекты, а именно: Read the rest of this entry »

Tags: