Как инициализировать класс в блоке в Ruby? - PullRequest
7 голосов
/ 22 марта 2012

Я не могу понять, правильно инициализировать блок

class Foo 
  attr_accessor :bar
end

obj = Foo.new do |a|
  a.bar = "baz"
end

puts obj.bar

Ожидайте "Баз" вместо этого получите ноль

Какое правильное заклинание для инициализаторов класса блока в ruby?

Ответы [ 4 ]

29 голосов
/ 23 марта 2012

Еще один способ сделать инициализатор блока - написать его самостоятельно:

class Foo
  attr_accessor :bar

  def initialize
    yield self if block_given?
  end
end

И позже использовать его:

foo = Foo.new do |f|
  f.bar = true
end

Мои два цента.

9 голосов
/ 22 марта 2012

Попробуйте еще раз:

class Foo 
  attr_accessor :bar
end

obj = Foo.new.tap do |a|
  a.bar = "baz"
end

puts obj.bar
2 голосов
/ 22 марта 2012

Я не думаю, что new может взять блок. Никогда его нигде не видел. Почему вы хотите инициализировать в блоке? Вы всегда можете сделать obj = foo.new.tap do |a| ... Если вы действительно хотите блок

0 голосов
/ 22 марта 2012

на самом деле у вас есть конструктор для этих целей:

class Foo
  attr_accessor :bar

  def initialize(bar = "baz")
    @bar = bar
  end

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