2010-08-04 8 views
1
proc = Proc.new do |name| 
    puts "Thank you #{name}!" 
end 
def thank 
    yield 
end 

proc.call # output nothing, just fine 
proc.call('God') # => Thank you God! 

thank &proC# output nothing, too. Fine; 
thank &proc('God') # Error! 
thank &proc.call('God') # Error! 
thank proc.call('God') # Error! 
# So, what should I do if I have to pass the 'God' to the proc and use the 'thank' method at the same time ? 

Спасибо :)Как передать параметры в proc при вызове метода? (Рубин)

ответ

8

Я думаю, что лучший способ:

def thank name 
    yield name if block_given? 
end 
7
def thank(arg, &block) 
    yield arg 
end 

proc = Proc.new do|name| 
    puts "Thank you #{name}" 
end 

Тогда вы можете сделать:

thank("God", &proc) 
+0

Вы должны добавить 2 пробела перед каждой строкой кода, чтобы сделать это образцом кода в вашем ответе. Он будет выглядеть красивее и добавит подсветку синтаксиса ко всем вашим строкам кода. – David

+2

Нет необходимости в ', & block' –

+0

@ Marc-André Lafortune: Вы имеете в виду определение' thank', а не его призвание, правильно? –

1

другой способ:

proc = Proc.new do |name| 
    puts "thank you #{name}" 
end 

def thank(proc_argument, name) 
    proc_argument.call(name) 
end 

thank(proc, "God") #=> "thank you God" 
thank(proc, "Jesus") #=> "thank you Jesus" 

Это работает, но я не люблю его. Тем не менее, это поможет читателям понять, КАК используются методы и блоки.