À quoi servent les symboles de tuyau en Ruby?
J'apprends Ruby et RoR, venant d'un PHP et Java background, mais je continue de rencontrer du code comme cette:
def new
@post = Post.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @post }
end
end
Quel est le |format|
partie faire? Quelle est la syntaxe équivalente de ces symboles de canal en PHP/Java?
Ce sont les variables cédées au bloc.
def this_method_takes_a_block
yield(5)
end
this_method_takes_a_block do |num|
puts num
end
Qui sort "5". Un exemple plus mystérieux:
def this_silly_method_too(num)
yield(num + 5)
end
this_silly_method_too(3) do |wtf|
puts wtf + 1
end
La sortie est "9".
C'était très étrange pour moi aussi au début, mais j'espère que cette explication/procédure vous aidera.
La documentation touche le sujet , dans un très bon sens - si ma réponse n'aide pas, je suis sûr que leur guide le fera.
Tout d'abord, lancez l'interpréteur interactif Ruby en tapant irb
dans votre shell et en appuyant sur Enter.
Tapez quelque chose comme:
the_numbers = ['ett','tva','tre','fyra','fem'] # congratulations! You now know how to count to five in Swedish.
juste pour que nous ayons un tableau avec lequel jouer. Ensuite, nous créons la boucle:
the_numbers.each do |linustorvalds|
puts linustorvalds
end
Il affichera tous les numéros, séparés par des retours à la ligne.
Dans d'autres langues, il faudrait écrire quelque chose comme:
for (i = 0; i < the_numbers.length; i++) {
linustorvalds = the_numbers[i]
print linustorvalds;
}
Les points importants à noter sont que le |thing_inside_the_pipes|
peut être n'importe quoi, tant que vous l'utilisez régulièrement. Et comprenez que ce sont des boucles dont nous parlons, c'est une chose que je n'ai obtenue que plus tard.
@names.each do |name|
puts "Hello #{name}!"
end
à http://www.Ruby-lang.org/en/documentation/quickstart/4/ est accompagné de cette explication:
each
est une méthode qui accepte un bloc de code puis exécute ce bloc de code pour chaque élément d'une liste, et le bit entredo
etend
est exactement un tel bloc . Un bloc est comme une fonction anonyme oulambda
. La variable entre les caractères de tuyau est le paramètre de ce bloc.Ce qui se passe ici, c'est que pour chaque entrée d'une liste,
name
est lié à cet élément de liste, puis l'expressionputs "Hello #{name}!"
est exécuté avec ce nom.
Le code du do
au end
définit un bloc Ruby . Le mot format
est un paramètre du bloc. Le bloc est transmis avec l'appel de méthode et la méthode appelée peut yield
valeurs au bloc.
Voir tout texte sur Ruby pour plus de détails, il s'agit d'une fonctionnalité de base de Ruby que vous verrez tout le temps).
L'équivalent dans Java serait quelque chose comme
// Prior definitions
interface RespondToHandler
{
public void doFormatting(FormatThingummy format);
}
void respondTo(RespondToHandler)
{
// ...
}
// Equivalent of your quoted code
respondTo(new RespondToHandler(){
public void doFormatting(FormatThingummy format)
{
format.html();
format.xml();
}
});
Les paramètres d'un bloc se situent entre les |
symboles.
Pour le rendre encore plus clair, si nécessaire:
les barres de tuyaux créent essentiellement une nouvelle variable pour contenir la valeur générée à partir de l'appel de méthode précédent. Quelque chose qui ressemble à:
Définition originale de votre méthode:
def example_method_a(argumentPassedIn)
yield(argumentPassedIn + 200)
end
Comment il est utilisé:
example_method_a(100) do |newVariable|
puts newVariable;
end
C'est presque la même chose que d'écrire ceci:
newVariable = example_method_a(100)
puts newVariable
où, newVariable = 200 + 100 = 300: D!