Есть ли преимущества в использовании инициализации блока? - PullRequest
4 голосов
/ 15 сентября 2009

Есть ли причина использовать инициализацию блока, например:

x = Observer.new do
  add_event(foo)
  some_other_instance_method_on_observer
  self.some_attribute = something
end

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

x = Observer.new
x.add_event(foo)
x.some_other_instance_method_on_observer
x.some_attribute = something

Ответы [ 4 ]

5 голосов
/ 15 сентября 2009

Единственная причина здесь в том, чтобы иметь более сжатый код (вам не нужно добавлять имя экземпляра перед вызовом метода). Используя блоки в целом, вы можете написать очень аккуратный, лаконичный и читаемый код. Иногда вы можете сэкономить потребителям своего кода много текста и даже логику кода. Вот традиционный случай!

file = File.open("some_file.txt","w")
file << "more code"
file.close

Сравните это с этим хорошим вариантом блока:

File.open("some_file.txt","w") { |file| file << "adding new stuff" }

Это избавило пользователя от необходимости открывать и закрывать (лично я все время забываю) файл сам. Вместо этого это заставило его сосредоточиться на том, что он хочет.

Старайтесь вкладывать блоки в такие ситуации +, когда вы хотите написать хорошие DSL.

4 голосов
/ 15 сентября 2009

Одним из преимуществ является то, что становится очевидным, что эти дополнительные действия являются действиями инициализации.

1 голос
/ 15 сентября 2009

Опираясь на ответ khell, переменные, созданные внутри блока, выходят за пределы блока, что хорошо, если вы больше не используете его.

0 голосов
/ 17 декабря 2013

Если ваш код в методе, который возвращает объект. Сравнить

def create_observer
    Observer.new {|x| x.foo, x.bar = calculate_foo, calculate_bar }
end

def create_observer
    x = Observer.new
    x.foo = calculate_foo
    x.bar = calculate_bar
    x
end

Таким образом, использование блока потенциально может позволить вам написать свою логику в одну строку. Даже если вы используете параллельное присваивание во втором примере, вам все равно нужно 3 строки.

Кроме того, проверьте tap здесь . Он имеет аналогичные преимущества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...