2016-11-22 2 views

Répondre

3
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" 
+0

@CarySwoveland done – fl00r