web-dev-qa-db-fra.com

À quoi servent ces symboles de pipe en Ruby?

À 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?

69
Philip Morton

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".

52
August Lilleaas

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.

32
Martin Josefsson
@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 entre do et end est exactement un tel bloc . Un bloc est comme une fonction anonyme ou lambda. 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'expression puts "Hello #{name}!" est exécuté avec ce nom.

6
Philip Durbin

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).

6
unwind

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();
    }
});
3
Jon Bright

Les paramètres d'un bloc se situent entre les | symboles.

3
dylanfm

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!

1
Jesse