2010-08-23 3 views
4
1.upto(9) { |x| print x } 

Pourquoi cela ne fonctionnera-t-il pas?En Ruby, quelles sont les lignes verticales?

{ print x |x} } 

Qu'en est-il de y?

+0

Qu'est-ce que tout le monde parle de paramètres? Qu'est-ce que ça veut dire!? Je ne suis pas habitué aux expressions lambda. – TIMEX

+1

Les paramètres sont les éléments que vous transmettez à une fonction. Ce n'est pas quelque chose de spécial pour lambdas. http://en.wikipedia.org/wiki/Parameter_%28computer_science%29 – Chuck

+1

Est-ce que | x | toujours écrit exactement juste après le "{"? – TIMEX

Répondre

7

C'est pour les paramètres qui sont passés à votre bloc. c'est-à-dire dans votre exemple, upto appellera votre bloc avec chaque numéro de 1 à 9 et la valeur actuelle est disponible comme x.

Les paramètres de bloc peuvent avoir n'importe quel nom, tout comme les paramètres de méthode. par exemple. 1.upto(9) { |num| puts num } est valide.

Tout comme les paramètres d'une méthode, vous pouvez également avoir plusieurs paramètres dans un bloc. par exemple.

hash.each_pair { |key, value| puts "#{key} is #{value}" } 
1

Les lignes verticales sont utilisées pour désigner les paramètres du bloc. Le bloc est le code inclus dans {}. C'est vraiment la syntaxe du bloc ruby, les paramètres du bloc et ensuite le code.

1

Ce n'est pas un opérateur; c'est délimiter la liste des arguments pour le bloc. Les barres sont équivalentes aux parens au def foo(x). Vous ne pouvez pas l'écrire comme {print x |x} pour la même raison ceci:

def foo(x) 
    puts "It's #{x}" 
end 

ne peut pas être réécrite comme ceci:

def foo 
    puts "It's #{x}" (x 
end 
+1

Qu'est-ce que cela signifie? Je ne comprends toujours pas. – TIMEX

0

Dans le morceau de code que vous avez spécifié, les lignes verticales sont une partie de la syntaxe de définition de bloc. Donc, { |x| print x } est un bloc de code fourni en tant que paramètre à la méthode upto, 9 est également un paramètre passé à la méthode upto.

Le bloc de code est représenté par un lambda ou un objet de la classe Proc dans Ruby. lambda dans ce cas est une fonction anonyme.

Donc, juste pour faire une analogie avec la syntaxe de définition de fonction,

def function_name(foo, bar, baz) 
    # Do something 
end 


{  # def function_name (Does not need a name, since its anonymous) 
|x|  # (foo, bar, baz) 
print x # # Do Something 
}  # end 
Questions connexes