2013-03-28 2 views
1

Я пытаюсь понять, когда использовать Ruby, блоки, и я вижу, что для того, чтобы настроить rspec-rails, что вам нужно сделать что-то вроде этого:Понимание блоков Ruby. Почему Rspec это делает?

RSpec::configure do |config| 
    config.foo = bar 
end 

Почему в этом случае было бы полезно, чтобы сделать это как блок?

ответ

2

Это только сахар. Это (упрощенный) источник:

module Rspec 
    def self.configuration 
    @configuration ||= RSpec::Core::Configuration.new 
    end 

    def self.configure 
    yield configuration if block_given? 
    end 

    # rest omitted 
end 

См.источник на https://github.com/rspec/rspec-core/blob/master/lib/rspec/core.rb

Это означает, что вы могли бы также написать

config = Rspec.configuration 
config.foo = bar 
1

Внутри блока вы меняете область видимости. Я считаю, что вы охвачены RSpec здесь, внутри блока. Я также считаю, что удобнее просто сказать config.foo = bar в блоке (изображение у вас есть 20+ конфигураций).

3

Потому что он получает утомительным префикс все с RSpec.configuration. Что вам больше нравится?

RSpec.configuration.some_config_option = 5 
RSpec.configuration.some_other_config_option = 6 
RSpec.configuration.yet_another_config_option = :foo 

Или:

RSpec.configure do |c| 
    c.some_config_option = 5 
    c.some_other_config_option = 6 
    c.yet_another_config_option = :foo 
end 

Очевидно, что вы могли бы написать c = RSpec.configuration, а затем использовать синтаксис c. после этого ... но блок также хорошо прицелы/разграничивает код конфигурации.

Смежные вопросы