Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between yield self and yield?

Tags:

yield

ruby

self

Could anyone please help me to understand the difference between "yield self" and "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
like image 878
vivek kumar Avatar asked Aug 20 '12 04:08

vivek kumar


2 Answers

In the case of yield self, self is the argument passed to the block. With simply yield, no argument is passed. self is not special here, anything could be yielded, e.g.

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
like image 161
numbers1311407 Avatar answered Nov 08 '22 23:11

numbers1311407


yield self enters block, associated with method call, passing current object as argument to the block, plain yield just enters the block without passing any arguments.

like image 20
Victor Deryagin Avatar answered Nov 09 '22 00:11

Victor Deryagin