Sólo se puede quitar la palabra clave auto
class Foo
def initialize
yield if block_given?
end
end
actualización de los comentarios
Usando rendimiento hay un poco nueva para mi gusto, especialmente cuando se utiliza fuera del IRB.
Sin embargo, hay una diferencia grande y significativa entre instance_eval aproximación y enfoque del rendimiento, compruebe este fragmento:
class Foo
def initialize(&block)
instance_eval(&block) if block_given?
end
end
x = Foo.new { def foo; 'foo'; end }
#=> #<Foo:0xb800f6a0>
x.foo #=> "foo"
z = Foo.new #=> #<Foo:0xb800806c>
z.foo #=>NoMethodError: undefined method `foo' for #<Foo:0xb800806c>
Comprobar éste a su vez:
class Foo2
def initialize
yield if block_given?
end
end
x = Foo2.new { def foo; 'foo'; end } #=> #<Foo:0xb7ff1bb4>
x.foo #=> private method `foo' called for #<Foo2:0xb8004930> (NoMethodError)
x.send :foo => "foo"
z = Foo.new #=> #<Foo:0xb800806c>
z.send :foo => "foo"
Como se puede ver la diferencia es que el anterior está agregando un método singleton foo al objeto que se inicializa, cuando e el último agrega un método privado a todas las instancias de la clase Object.
En su "Editar para aclarar", ¿no quiere decir que el yo se rindió al obj en el bloque? Tal vez solo estoy leyéndola de una manera diferente, pero veo que el objeto se inicializa, el yo se cede al bloque como 'obj' y luego dentro del bloque el método foo se define en sí mismo a través de obj. – uzo
Estoy bastante seguro, nos referimos a lo mismo. Escribí "la instancia de Foo recién creada" porque self dentro del método de inicialización (que es la instancia de Foo recién creada) no es lo mismo que self dentro del bloque y si solo dice "self", no está claro a qué se refiere. – sepp2k