7
votes

Obtenir l'objet de fonction rubis elle-même

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 xxx

contrairement à Python, f est le résultat de la fonction, pas la fonction elle-même. Par conséquent, f () , f , objet vasque.f sont tous "foo" . Egalement f.methods renvoie juste la liste de méthodes de chaîne.

Comment accéder à l'objet de fonction elle-même?


5 commentaires

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


7 Réponses :


0
votes

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.

Espérons que quelqu'un me prouvera mal, mais je n'ai jamais été capable de le retirer.


0 commentaires

1
votes

en rubis, ce que vous demandez n'a pas de sens. (Il est logique dans des langues comme Python, JavaScript, Java et C #.)

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 f à cette instance, voici le comportement que l'instance doit répondre avec. Il n'y a pas d'objet de fonction.

Vous pouvez faire des choses comme obtenir un symbole ( méthod_name =: foo ) et obtenir une fermeture ( méthode = proc {obj.foo} ).


3 commentaires

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



1
votes

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: xxx

par exemple: xxx


2 commentaires

def f; "foo"; fin 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.



3
votes

La méthode méthode vous donnera une méthode (code> objet xxx

ceci f est lié à obj . Vous pouvez également obtenir une méthode non liée: xxx

(il y a aussi une méthode d'engine)


3 commentaires

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.



3
votes

Eh bien, j'ai trouvé la réponse moi-même xxx

merci à tous pour l'inspiration :)


2 commentaires

Cela vous donne la méthode, mais pas une fonction pure. La création d'un objet proc 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 '



10
votes

Vous utilisez simplement la méthode méthode . Cela retournera la méthode instance correspondant à cette méthode. Quelques exemples: xxx

espère que cela aide cela aide.


1 commentaires

Oh, et l'objet de la méthode est un objet de type PROC, vous devez donc le doo obj.method (: f) .Call () ou obj.method (: f) [] Appeler ça. Ou, sur Ruby 1.9.1; obj.method (: f). () .



0
votes

Vous devez créer un objet proc si vous souhaitez un objet de fonction xxx

vous appelez la fonction à l'aide de xxx

ou xxx

Vous pouvez même utiliser cet objet de fonction dans une carte opération xxx


0 commentaires