Общие рубиновые идиомы - PullRequest
63 голосов
/ 05 марта 2009

Одна вещь, которая мне нравится в ruby, это то, что в основном это очень читаемый язык (который отлично подходит для самодокументируемого кода)

Однако, вдохновленный этим вопросом: Ruby Code объяснил и описание того, как ||= работает в ruby, я думал о рубиновых идиомах, которые я не использую, и, честно говоря, я их не совсем понимаю.

Итак, мой вопрос, похожий на пример из упомянутого вопроса, о каких общих, но не очевидных, рубиновых идиомах мне нужно знать, чтобы быть по-настоящему опытным программистом?

Кстати, из упомянутого вопроса

a ||= b 

эквивалентно

if a == nil || a == false
  a = b
end

(Спасибо Иану Терреллу за исправление)

Редактировать: Оказывается, этот пункт не является абсолютно спорным. Правильное расширение на самом деле

(a || (a = (b))) 

Смотрите эти ссылки, чтобы узнать, почему:

Спасибо Jörg W Mittag за указание на это.

Ответы [ 15 ]

1 голос
/ 09 марта 2011
a = (b && b.attribute) || "default"

примерно:

if ( ! b.nil? && ! b == false) && ( ! b.attribute.nil? && ! b.attribute.false) a = b
else a = "default"

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

1 голос
/ 05 июля 2010

Вы можете легко копировать с помощью Marshaling объекта. - взято из языка программирования Ruby

def deepcopy(o)
  Marshal.load(Marshal.dump(o))
end

Обратите внимание, что файлы и потоки ввода / вывода, а а также объекты Method и Binding, слишком динамичны, чтобы их можно было маршалировать; там не будет надежного способа восстановить их состояние.

0 голосов
/ 22 апреля 2017

Хороший вопрос!

Как мне кажется, чем более интуитивно понятен и быстрее код, тем лучшее программное обеспечение мы создаем. Я покажу вам, как я выражаю свои мысли, используя Ruby в маленьких фрагментах кода. Подробнее здесь

Карта

Мы можем использовать метод карты по-разному:

user_ids = users.map { |user| user.id }

Или:

user_ids = users.map(&:id)

Sample

Мы можем использовать метод ранда:

[1, 2, 3][rand(3)]

Перемешать:

[1, 2, 3].shuffle.first

И идиоматичный, простой и легкий способ ... образец!

[1, 2, 3].sample

Двойная труба равно / Memoization

Как вы сказали в описании, мы можем использовать памятку:

some_variable ||= 10
puts some_variable # => 10

some_variable ||= 99
puts some_variable # => 10

Статический метод / метод класса

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

GetSearchResult.call(params)

Simple. Красивая. Интуитивно. Что происходит в фоновом режиме?

class GetSearchResult
  def self.call(params)
    new(params).call
  end

  def initialize(params)
    @params = params
  end

  def call
    # ... your code here ...
  end
end

Для получения дополнительной информации о написании идиоматического кода Ruby читайте здесь

0 голосов
/ 20 июня 2014

метод отсутствует магия

class Dummy  
  def method_missing(m, *args, &block)  
    "You just called method with name #{m} and arguments- #{args}"  
  end  
end

Dummy.new.anything(10, 20)
=> "You just called method with name anything and arguments- [10, 20]"

если вы вызываете методы, которых нет в объектах ruby, интерпретатор ruby ​​вызовет метод с именем 'method_missing', если он определен, вы можете использовать его для некоторых приемов, таких как написание оболочек api или dsl, где вы не знаете всех имена методов и параметров

0 голосов
/ 28 марта 2010

Array.pack и String.unpack для работы с двоичными файлами:

# extracts four binary sint32s to four Integers in an Array
data.unpack("iiii") 
...