def test(args,&block)
yield
end
test 1, {puts "hello"}
La dernière ligne ne fonctionne pas. Comment passer un bloc avec d'autres arguments?Comment passer un bloc avec d'autres arguments?
def test(args,&block)
yield
end
test 1, {puts "hello"}
La dernière ligne ne fonctionne pas. Comment passer un bloc avec d'autres arguments?Comment passer un bloc avec d'autres arguments?
test(1){ puts "hello" }
ou
test(1) do
puts "hello"
end
ou
blk = proc{ puts "hello" }
test(1, &blk)
Vous pouvez consulter cette https://pine.fm/LearnToProgram/chap_10.html
Comme @Cary Swoveland a suggéré que nous pouvons aller un peu plus profond.
Toute méthode Ruby peut implicitement accepter un bloc. Et même si vous ne l'avez pas défini dans la signature de votre méthode, vous pouvez toujours la capturer et la transmettre plus avant.
Donc, compte tenu de cette idée que nous pouvons faire des manipulations suivantes avec votre méthode:
def test(args, &block)
yield
end
est le même que
def test(args)
yield
end
et la même chose que
def test(args)
block = Proc.new
block.call
end
Lorsque vous avez ce bloc implicite capture vous voudrez probablement ajouter un contrôle supplémentaire:
def test(args)
if block_given?
block = Proc.new
block.call
else
"no block"
end
end
ou
def test(args)
if block_given?
yield
else
"no block"
end
end
Donc, appeler ces méthodes retourner suivantes:
test("args")
#=> no block
test("args"){ "Hello World" }
#=> "Hello World"
@CarySwoveland done – fl00r
'test (1) {puts "bonjour"}' – fl00r