Разница между урожайностью и урожайностью?
Может ли кто-нибудь помочь мне разобраться в различии между "yield self" и "yield"?
class YieldFirstLast
attr_accessor :first, :last
def initialize(first = nil, last = nil)
@first = first
@last = last
yield self if block_given?
end
def hello
puts "#{@first} #{@last} says hello!"
end
end
Ответы
Ответ 1
В случае yield self
, self
- это аргумент, переданный блоку. Просто yield
аргумент не передается. self
здесь не является чем-то особенным, что-то может быть достигнуто, например
class Foo
def a() yield self end
def b() yield end
def c() yield "Bar" end
def d() yield 1, 2, "scuba" end
def to_s() "A!" end
end
Foo.new.a {|x| puts x } #=> A!
Foo.new.b {|x| puts x } #=> (a blank line, nil was yielded)
Foo.new.c {|x| puts x } #=> Bar
Foo.new.d {|x, y, z| puts z } #=> scuba
Ответ 2
yield self
вводит блок, связанный с вызовом метода, передавая текущий объект в качестве аргумента блоку, plain yield
просто входит в блок без передачи каких-либо аргументов.
Ответ 3
Вспомните yield
как вызов вашего блока, а yield self
вызывает ваш блок с текущим экземпляром в качестве параметра.