dans Ruby, tout est censé être un objet. Mais j'ai un gros problème pour arriver à l'objet de la fonction défini la manière habituelle, comme contrairement à Python, f est le résultat de la fonction, pas la fonction elle-même. Par conséquent, Comment accéder à l'objet de fonction elle-même? P> p> f () code>, f code>, objet vasque.f code> sont tous "foo" code>. Egalement f.methods code> renvoie juste la liste de méthodes de chaîne. P>
7 Réponses :
Vous pouvez obtenir un objet qui correspondra à cette fonction au moment de l'exécution, mais aussi loin que je sache, il n'y a pas d'équivalent à ce que Python vous permet de faire de là dans la définition de la fonction / de la classe. p>
Espérons que quelqu'un me prouvera mal, mais je n'ai jamais été capable de le retirer. P>
en rubis, ce que vous demandez n'a pas de sens. (Il est logique dans des langues comme Python, JavaScript, Java et C #.) P>
Dans Ruby, vous pouvez dire à une classe quels messages il devrait répondre à et de quelle manière il devrait répondre à ces messages. Le moyen le plus courant de dire à une classe qui consiste à définir une méthode dans la classe. Mais encore une fois, cela signifie simplement: lorsque quelqu'un envoie le message Vous pouvez faire des choses comme obtenir un symbole ( f code> à cette instance, voici le comportement que l'instance doit répondre avec. Il n'y a pas d'objet de fonction. P>
méthod_name =: foo code>) et obtenir une fermeture ( méthode = proc {obj.foo} p>). P>
Si f n'est pas un objet, pourquoi est-ce dans ObjectSpace alors?
Les méthodes sont des objets. Ce ne sont tout simplement pas des objets que l'exécution vous permet d'accéder pendant qu'ils sont toujours définis. Si vous voulez faire cela, collez-vous à Python.
En fait, il existe une classe de méthodes que toutes les méthodes sont une instance de. Lorsque vous faites obj.some_mesthod code> dans Ruby, il envoie le message à OBJ, qui compte dans sa liste de méthodes pour une méthode correspondante, puis appelle cette méthode. S'il ne peut pas trouver la méthode, il appelle méthody_missing code>.
Ce n'est pas une fonction; C'est une méthode d'un objet. Si vous souhaitez obtenir un objet représentant une méthode, vous demandez à l'objet de possession: par exemple: p>
def f; "foo"; fin code> n'est vraiment pas une fonction?
Conceptuellement, non - c'est une méthode. Il est intrinsèquement lié à un propriétaire de Ruby. L'équivalent rubis le plus proche des fonctions vraies serait des procs.
La méthode ceci (il y a aussi une méthode d'engine) p> p> p> méthode code> vous donnera une méthode (code> objet code> f code> est lié à obj . Vous pouvez également obtenir une méthode non liée: p>
Donc, vous diriez que mon F est une méthode non liée. Il semble raisonnable. Cependant, le fait que mon F SLS agisse comme des méthodes d'objetSpace (qui renvoient autrement les objets) est déroutante
Eh bien, il ne répond toujours pas à ma question, comment puis-je traiter mon F comme instance de méthode
@MYKHAL: Toute méthode que vous définissez au niveau supérieur devient une méthode d'objet d'objet, donc ObjectSpace (qui est un objet, comme tout le reste de la langue) obtient également la méthode. Vous ne devriez normalement pas pouvoir l'appeler de l'extérieur de ObjectSpace, bien que les méthodes définissaient de cette manière par défaut d'être privée.
Eh bien, j'ai trouvé la réponse moi-même merci à tous pour l'inspiration :) p> p>
Cela vous donne la méthode, mais pas une fonction pure. La création d'un objet proc code> est peut-être plus proche de ce que vous voulez. Une méthode nécessite toujours un récepteur, car elle est liée à un objet, un proc (Edition) est un objet par lui-même et peut donc simplement être appelé comme une fonction.
@Adrian il donne une méthode non liée. Essayez-vous: ruby -e 'def f; "foo"; finir; obj = méthode: f; met obj.call ' code>
Vous utilisez simplement la méthode code> méthode code>. Cela retournera la méthode espère que cela aide cela aide. P> p> code> instance correspondant à cette méthode. Quelques exemples:
Oh, et l'objet de la méthode est un objet de type PROC, vous devez donc le doo obj.method (: f) .Call () code> ou obj.method (: f) [] code > Appeler ça. Ou, sur Ruby 1.9.1; obj.method (: f). () code>.
Vous devez créer un objet vous appelez la fonction à l'aide de p> ou p> Vous pouvez même utiliser cet objet de fonction dans une carte code> opération p> proc code> si vous souhaitez un objet de fonction
C'est l'une des choses (beaucoup) qui me conduisent Berserk à Ruby. Vous ne pouvez pas vous référer à une fonction par nom sans l'invoquer. J'ai des arguments à ce sujet avec ma vache orkers.
Je pense que Ruby a sa propre manière et certains principes utilisés dans d'autres langues ne s'appliquent tout simplement pas (dans ce cas, je définirais probablement la fonction avec PROC ou utiliser le bloc de code), mais je me demande toujours s'il y a une réponse positive à ma question
@Jonathan: Vous pouvez vous référer à un nom de méthode sans l'appeler. Le nom d'une méthode est un symbole. Donc, le nom de cette méthode est
: f code>. Ruby est jolie connue pour ses capacités de métaprogrammation et les noms de méthodes sont utilisés tout le temps là-bas.@Chuck symboles ne sont pas couplés à des fonctions du tout i>, ce sont des objets de chaîne légers (ils n'ont qu'un petit sous-ensemble de méthodes utilisées au lieu de constantes. Où que vous puissiez passer un symbole comme nom de méthode, vous pouvez passer une chaîne plutôt que si vous le souhaitez.
@dvyjones: Je n'ai pas dit qu'ils sont couplés à des méthodes. J'ai dit qu'ils peuvent être utilisés pour désigner le nom d'une méthode, en réponse à la revendication de Jonathan selon laquelle "Vous ne pouvez pas faire référence à une méthode par nom". En fait, il serait impossible qu'un nom de méthode soit couplé avec elle, car de nombreuses méthodes peuvent partager le même nom.