6
votes

Comment utilisez-vous des blocs de rubis pour exécuter de manière conditionnelle quelque chose?

J'ai récemment acheté le livre sept langues en sept semaines et avez lu via le chapitre sur Ruby. Dans la section qui introduit des blocs (page 40), un échantillon de code est donné qui illustre l'utilisation de blocs dans le but d'exécuter de manière conditionnelle quelque chose: xxx

Ce code n'a pas beaucoup de sens à Moi et le livre ne fournit pas une grande explication. Je me demandais si l'un de vous GURUS GURUS voudriez-vous aider à m'aider à obtenir ma tête autour de celui-ci.

Comment pouvez-vous avoir un bloc et une fonction avec le même nom? Comment définiriez-vous "d'urgence?" Je ne peux même pas créer le bloc dans l'IRB sans qu'il se plaint: xxx

et comment voudriez-vous invoquer ce code pour démontrer comment cela fonctionne? Merci!


0 commentaires

3 Réponses :


10
votes

Tout d'abord: les deux sont dans le mauvais ordre. Vous devez définir in_case_of_emergence d'abord.

secondaire: vous ne nommez pas de blocs; Par conséquent, il est incorrect qu'il y a deux éléments nommés in_case_of_emergence . L'une est une définition de la fonction, tandis que la seconde est la fonction Invocation de cette même fonction.

donc, étape par étape: xxx

Disons que vous avez cette fonction qui renvoie true la moitié de l'heure et false la moitié de l'heure, au hasard. (Garçon, c'est beaucoup d'urgences!) Alors: xxx

Ceci définit une fonction nommée in_case_of_emergence . Lorsqu'il est appelé, il exécute rendement si urgent? , qui est une déclaration (code> modifiée par le conditionnel si . Il s'agit de sucre syntaxique pour xxx

Notez que Ruby ne nécessite pas de crochets pour l'invocation de la fonction, nous pouvons donc les déposer; et s'il n'y a qu'une seule déclaration à l'intérieur d'un si , vous pouvez l'écrire sur la même ligne que ci-dessus (évitant le besoin d'un fin ).

Ensuite, nous avons une invocation de la fonction: xxx

Ceci appelle la fonction que nous venons de définir, in_case_of_emergence , en passant un bloc à exécuter. Ce sont les deux états ( user_crediting_card , panique ) qui serait exécuté par produire - mais uniquement si l'urgence > Évalue à true .

Cela a-t-il plus de sens maintenant?


3 commentaires

Amadan a raison. @Steve Êtes-vous sûr que le livre a donné le code dans cet ordre?


Oui, c'était l'ordre donné dans le livre.


Je recommande de changer de livres. = / Programmingzen.com/Ruby-and-Rails-Recommendend-Books Une fois que j'ai appris la syntaxe, j'ai le plus appris de la documentation.



2
votes

C'est simple, c'est la méthode: xxx pré>

et c'est l'appel à votre méthode: p> xxx pré>

Wheres p >

do
   use_credit_card
   panic
end 


0 commentaires

2
votes

Ajout à d'autres réponses, il peut être plus facile de comprendre les blocs si vous déposez le mot clé Code> le mot clé et traitez des blocs dans des procédés tels que les processus qu'ils sont réellement.

# for testing purposes, let's always have `emergency?` return `true`
def emergency?
  true
end  

def in_case_of_emergency(&block)
  block.call if emergency?
end

in_case_of_emergency do
  puts "AHH! Emergency! Help!", "Seriously, I'm freaking out!"
end


0 commentaires