Ваш текущий код будет просто игнорировать блок, так как вы не yield
к нему.Для того, что вы пытаетесь сделать в первом примере, вам нужна идиома yield self
в initialize
.
Для того, зачем вам сначала нужна переменная блока, подумайте о том, каким будет получатель для some_method
во втором примере.Без явного получателя это верхний уровень main
(если, конечно, этот код не является частью какого-то другого класса, где этот включающий класс будет self
).См. Пост в блоге Дэйва Томаса Изменение себя в Ruby (или пост Иегуды Каца , как указал Никлас Б. в комментариях) для получения дополнительной информации по этой теме (комментарии проясняютсячасть "proc prococation").
Редактировать: все, что сказано, похоже, работает, но я предпочитаю версию yield self
и пример 1:
class NewClass
def initialize
@a = 1
end
def some_method
puts "Hello: #@a"
end
def self.build(&block)
x = self.new
x.instance_eval(&block)
x
end
end
NewClass.build do
some_method
end
Это позволяет вамвыполнить блок без переменной блока и вернет новый экземпляр класса для присвоения переменной и т. д.