2008-11-01 4 views
21

J'ai une méthode Ruby comme ceci:pour mettre un bloc sur une seule ligne

def something(variable, &block) 
    .... 
end 

Et je veux l'appeler comme ceci:

something 'hello' { do_it } 

Sauf que n » t travaillant pour moi, je reçois une erreur de syntaxe. Si je fais ça à la place, cela fonctionne:

something 'hello' do 
    do_it 
end 

Sauf là, je suis un peu de manquer la belle apparence de celui-ci étant sur une ligne.

Je peux voir pourquoi cela se produit, car il pourrait sembler que c'est un hachage qui est passé comme une deuxième variable, mais sans virgule entre les variables ... mais je suppose qu'il doit y avoir un moyen de faire face à ce qui me manque. Y a-t-il?

Répondre

32

Vous devez parenthésée votre argument:

something('hello') { do_it } 

Cela devrait fonctionner.

+0

oui, ça le fait !! Merci. Parfois, ce sont les choses les plus évidentes qui vous manquent ;-) –

+0

@Cameron Booth: Alors peut-être que vous pouvez accepter sa réponse? :) – Pistos

1

Si vous souhaitez que "def something" accepte un bloc, vous devez fournir des données à ce bloc. Par exemple:

#to uppercase string 
def something(my_input) 
yield my_input.upcase 
end 

# => "HELLO WORLD" 
something("hello world") { |i| puts i} 
+0

Ce n'est pas nécessairement vrai. Vous ne pouvez rien céder, passer le bloc à une autre méthode ou choisir de l'ignorer. Il n'y a pas de besoin spécifique de céder quelque chose au bloc. De la façon dont la méthode de la question d'origine a été écrite, le bloc passwd sera converti en 'Proc' nommé' block'. – nertzy

0

Euh, qu'en est:

>> def something(arg1 , &block) 
>> yield block 
>> end 
=> nil 
>> def do_it 
>> puts "Doing it!" 
>> end 
=> nil 
>> something('hello') { do_it } 
"Doing it!" 
=> nil