2016-10-28 10 views
3

Ruby初心者のために、なぜメソッド定義内でyield selfに有益なのか、私には分かりません。私はこの機能を多くのチュートリアルで役立ててくれました。それは私には完璧な意味があります。どうすればが動作しますが、私は理解できません。なぜあなたはこれを使ったでしょうか?なぜ `yield self`が役立つのですか?

のは、私は次のコードがあるとしましょう:

class Dog 

    attr_accessor :breed 

    def initialize 
    @breed = "Westie" 
    end 

    def bark 
    puts "Woof!" 
    yield self if block_given? 
    end 

end 

fido = Dog.new 

fido.bark do |d| 
    puts "Bark, bark, bark!" 
    puts d.breed 
end 

はそうそう、 yield selfを経て、私は今、私はあまりにも得ていたブロック内 Dogクラスのインスタンスへのアクセスを持っています。

しかし、私がyield selfではない場合でも、私はまだそのインスタンスにアクセスするでしょうか?つまり、以下のコードは正確にはのコードと同じではありませんか?

class Dog 

    attr_accessor :breed 

    def initialize 
    @breed = "Westie" 
    end 

    def bark 
    puts "Woof!" 
    yield 
    end 

end 

fido = Dog.new 

fido.bark do 
    puts "Bark, bark, bark!" 
    puts fido.breed 
end 

2番目のコードサンプルでは、​​私はyield selfを呼び出していないことに注意してください。

私は明らかにこのユーティリティを欠いています。

答えて

5

第二の例があるため、あなたがDogを参照するローカル変数を持っている特定の状況で動作します。代わりに、匿名のインスタンスを使用するとどうなるか考えてみましょう。

Dog.new.bark do 
    puts "Bark, bark, bark!" 
    # what goes here?? puts ????.breed 
end 

または他の場所にブロックを宣言して、

loud = lambda { |dog| puts "A #{dog.breed} doing some LOUD YAPPING" } 

puts d.bark(&loud) 

ので、基本的にyield selfに設定すると、あなたのコードを使用することができますどのように柔軟性を提供します。

+0

ああ、私は匿名インスタンスのコンテキスト内で 'yield self'を考慮しませんでした。それは私にとって意味のあるユーティリティです。ありがとう!あなたの2番目の例は私にはあまり明らかではありませんが、私はまだRubyにはあまりにも新しかったからです。私はもう少し考えなければならないでしょう。 :)助けを感謝します。 – filmnut

3

あなたの例は非常に簡単で、その中にはyield selfの明白な用途はありません。

tapと同じように、の場合があります。ローカルスコープに変数を導入せずに値を定義して使用することができます。

A(確かに非常に不自然)の例では、次のようになります。

Dog.new.bark do |d| 
    puts d.breed 
end 
関連する問題