6
votes

Pouvez-vous expliquer ce qui se passe dans ce code rubis?

J'essaie d'apprendre Ruby ainsi que de rubis sur rails en ce moment. Je suis suivant avec les rails d'apprentissage, la 1ère édition, mais je suis difficile à comprendre une partie du code.

Je travaille généralement dans C, C ++ ou Java, donc Ruby est un très gros changement pour moi .

Je suis actuellement soulevé par le bloc de code suivant pour un migrateur de base de données: xxx

Où est la variable T? Qu'est-ce que cela représente réellement? Est-ce une sorte de ressemblance comme le "i" dans un (i = 0; i <5; i ++) énoncé?

aussi, où est la suivante: les entrées étant définies? (Les entrées sont le nom de mon contrôleur, mais comment cette fonction sait-elle à ce sujet?)


1 commentaires

Ne vous laissez pas duper en pensant que Ruby Do ... Les blocs de fin ou {} sont les mêmes que {} dans C / C ++ / Java: bien qu'ils puissent parfois être utilisés de cette façon, ils fonctionnent très différemment, comme vous le souhaitez. remarqué.


10 Réponses :


1
votes

Create_Table est la méthode qui accepte l'expression Lambda (une sorte de délégué), T est l'argument du délégué. Donc, lorsque vous exécutez Create_Table, il exécute xxx pré>

quelque chose comme pseudo code p> xxx pré>

analogique direct dans Java est une classe anonime. P>

addReturnBackListener(new Listener<EventObject>() {
  public void handle(EventObject e) {
     refreshAndShowAndList();
  }
});


1 commentaires

Oui, besoin de quelque chose pour réparer mes erreurs :)



2
votes

Je vais prendre le t code> chose. La méthode Create_Table code> est comme une fonction C qui prend un pointeur de fonction qui prend un argument, l'objet Définition de la table (pardonnez à mes compétences en C inexistantes):

a = 10
create_table :entries do |t|
  puts a
  ...
end


0 commentaires

0
votes

C'est une utilisation typique des blocs de rubis. La méthode Create_table est définie dans ActiveRecord comme: xxx


0 commentaires

9
votes

: entrées est un symbole littéral, c'est une valeur littérale comme 7 ou "une chaîne" . Il n'y a rien à définir (incidemment, la fonction ne connaît pas le nom de votre contrôleur).

t est le paramètre sur le bloc que vous avez transmis au Create_Tables < / code> méthode. Ce que vous avez écrit ici est grossièrement analogue à quelque chose comme: xxx

en C ++. Create_Table appelle votre bloc et transmet le paramètre que vous avez nommé t . Je vous suggérerais d'obtenir un livre d'introduction pour ruby ​​ par opposition aux rails. Je vous recommande ruby ​​pour rails par david A. noir.


0 commentaires

1
votes

: Les entrées font référence à la table des entrées dans les rails.

Le migrateur l'aurait connu à ce sujet lorsque la commande "Generate Controller" a été donnée aussi loin que je comprenne (travaillé avec des rails professionnels pendant un an, mais toujours l'apprentissage de ). p>

comme pour le | t | c'est un bloc. Pour citer le livre Pickaxe (que vous devez obtenir immédiatement une copie de PDF ou de la version de l'arbre mort): P>

Les blocs peuvent être utilisés pour définir un morceau de code qui doit être exécuté sous une sorte de contrôle transactionnel. Par exemple, vous ouvrirez souvent un fichier, faites quelque chose avec son contenu, puis vous voulez vous assurer que le fichier est fermé lorsque vous avez terminé. Bien que vous puissiez le faire en utilisant du code conventionnel, il existe un argument pour rendre le dossier responsable de la fermeture elle-même. Nous pouvons faire cela avec des blocs. P> blockQuote>

Alors, qu'est-ce qui se passe avec ci-dessus est que le | t | est le bloc qui gère la configuration de la connexion à la base de données, créant ainsi les lignes en fonction de leurs types spécifiques, puis la fermeture de la connexion. P>

Voici un autre exemple: p>

an_array = [1,2,3,4]
an_array.each do |line|#line is the block for the elements of the array during iteration
   puts "Now we are at: #{line.to_s}!" 
end


1 commentaires

Voici un lien vers la première édition du livre "Programmation Ruby" (AKA The Pickaxe Book) RubyCentral.com/book < / a>



1
votes

La méthode Create_Table est ce que l'on appelle un bloc de rubis et t est une variable locale à ce bloc ( t est Juste une convention dans les migrations des rails qui représente une "table"). C'est un autre exemple plus évident d'un bloc rubis: xxx

: entrées est un symbole rubis, qui est une sorte de chaîne légère utilisée pour nommer des choses. Vous auriez également pu utiliser "entrées" . Une utilisation courante des symboles est destinée à spécifier les clés dans un hachage. Dans les deux cas, la table étant créée est nommée "entrées".


0 commentaires


1
votes

Je travaille sur une application qui possède également une entrée entrée Modèle / entrées table. Voici ma migration: xxx

très similaire à ce que vous regardez.

premier off, première ligne, déclarant une classe appelée Createtries qui s'étend activeCord :: migration .

Suivant, déclarant une méthode de classe appelée up () . Une méthode de classe, par opposition à une méthode d'instance appartient à la classe plutôt qu'à des objets spécifiques de la classe. C'est le mot-clé " auto " qui l'oblige à être une méthode de classe.

appel suivant create_table () et le transmettant deux choses:

  1. Un symbole (": entrées ") qui, comme mentionné ci-dessus, est comme un littéral à chaîne. Cela indique à Activerecord ce que le tableau qu'il crée devrait être appelé. Disons que vous avez dactylographié ce code à la main - oubliez les générateurs pendant une minute. Vous avez tapé ": entrées " Parce que vous savez que par les tables de congrès dans une application de Rails sont nommées avec des noms pluriels et que vous savez que la classe modèle qui se connecte à cette table sera appelée entrée .

  2. passe également un bloc.

    Un bloc peut être enfermé par ... xxx

    ou par xxx

    un bloc peut prendre des paramètres joints par deux " | " s. Dans ce cas, la méthode Create_Table passe au bloc Un objet de classe Tablefinition , afin de répondre à l'une de vos questions, t est le var tenant cet objet. Ensuite, à l'intérieur du bloc, nous appelons diverses méthodes d'instance de tablefinition .

    Où est l'objet TableFinition vient? Cela se produit dans la méthode Create_Table () . Il contient le code qui instancie une nouvelle TableFinition objet et "rendements" sur le bloc ....

    code source ActiveRecord ... xxx


0 commentaires

0
votes

: entrées est défini là-bas. Le code appelle la méthode create_table avec deux arguments - le nom souhaité de la table et un bloc de code.

Create_Table construira un objet TableFinition , puis cédez au bloc de code, fournissant cet objet à celui-ci. Dans le bloc du code, il sera nommé t . Et enfin que le bloc de code appelle certaines méthodes sur t pour créer des colonnes.


0 commentaires

0
votes

Depuis, venant de Python, j'ai eu du mal à comprendre cette construction moi-même, je donnerai la traduction non spythonique de votre extrait de code.

Tout d'abord, vous devriez définir une fonction créer_table comme ça Un (c'est juste un squelette): xxx

puis, pour chaque table, vous créeriez une fonction de configuration comme: xxx

Et enfin, vous créeriez la table en appelant: xxx

Ce n'est pas la façon dont il serait fait avec python. Si vous êtes intéressé par la manière de créer une table dans Python, vous devriez examiner comment Django ou sqlalchemy poignée que.


0 commentaires