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ď č. 1Jediná 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"