Ruby Blocks внутри модуля или класса

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

$ ruby ​​lesson1.rb Traceback (последний вызов был последним): 2: from lesson1.rb: 1: in <main>' 1: from lesson1.rb:2:in'lesson1.rb: 9: in <class:Sample>': undefined methodsay_hi 'для M1::Sample:Class (NoMethodError)

Имя файла: lessson1.rb

module M1
  class Sample 
      def say_hi( name )
        puts "Hello, #{name}! Entered the method"
        yield
        puts "Exiting the method"
      end

      say_hi("Block") do
        puts "Good Day"
      end

    end
end

1 ответ

Решение

Да, вы можете использовать блок в вызове метода на уровне класса / модуля. Причина, по которой вы получаете ошибку, не из-за блока, а потому, что вы звоните say_hi в контексте класса, поэтому он ищет методы самого класса, а не методы экземпляров класса. Вы определили say_hi как метод экземпляра, поэтому он недоступен на уровне класса. Если вы измените его на def self.say_hi( name )работает нормально.

Другие вопросы по тегам