/ / Existuje nejaký rozdiel v použití "výnosu" v metóde s parametrom `& block 'a` yield self` v metóde bez parametra `& block'? - rubín, výnos

Existuje nejaký rozdiel v používaní metódy "yield self" v metóde s parametrom `& block 'a` yield self` v metóde bez parametra `& block'? - rubín, výnos

Rozumiem tomu

def a(&block)
block.call(self)
end

a

def a()
yield self
end

viesť k rovnakému výsledku, ak predpokladám, že existuje takýto blok a {}, Moja otázka je - keďže som narazil na nejaký kód, či má nejaký rozdiel, alebo ak existuje nejaká výhoda mať (ak inak nepoužívam premenný / referenčný blok):

def a(&block)
yield self
end

Toto je konkrétny prípad, keď nerozumiem používaniu &block:

def rule(code, name, &block)
@rules = [] if @rules.nil?
@rules << Rule.new(code, name)
yield self
end

odpovede:

8 pre odpoveď č. 1

Jediná výhoda, ktorú myslím, je introspekcia:

def foo;       end
def bar(&blk); end

method(:foo).parameters  #=> []
method(:bar).parameters  #=> [[:block, :blk]]

IDE a generátory dokumentácie môžu trvaťvýhodou tohto. Avšak neovplyvňuje argument Rubyho. Pri volaní metódy môžete prejsť alebo vynechať blok bez ohľadu na to, či je deklarovaný alebo vyvolaný.


1 pre odpoveď č. 2

Hlavný rozdiel medzi

def pass_block
yield
end
pass_block { "hi" } #=> "hi"

a

def pass_proc(&blk)
blk.call
end
pass_proc  { "hi" } #=> "hi"

je to, blk, príklad z Proc, je objekt, a preto môže byť prenesený na iné metódy. Na rozdiel od toho bloky nie sú objektmi a preto nemôžu byť prenesené.

def pass_proc(&blk)
puts "blk.is_a?(Proc)=#{blk.is_a?(Proc)}"
receive_proc(blk)
end

def receive_proc(proc)
proc.call
end

pass_proc { "ho" }
blk.is_a?(Proc)=true
#=> "ho"