Maison > Questions et réponses > le corps du texte
我是因为用了coffee所以萌生出想学学ruby的想法的,因为才刚开始学习,所以有些问题可能比较初级。
我看的代码里大量使用了:xxxx
之类的语法,我从网上查到这个叫Symbol
,从用法上来看它的本质应该是不是一种不需要预定义,但是会被预编译的常量?
作为从其他语言转向ruby的,我发现ruby在一个class调用this
有如下几种
self.xxxx
xxxx
方法@
这给我这种习惯了在java
, php
这类语言里只有一种方法引用类本身的人带来了疑惑(当然java也可以省略this),可以具体解释下这三类用法的区别么?
我在很多rails项目发现了这种代码
class Person
attr_accessor :name
def set_name(your_name)
name = your_name
end
end
def ... end
那个没啥问题,但是前面的attr_accessor :name
怎么看怎么像一个正常的方法调用嘛,是这样吗?这里的方法跟一般的方法有啥不同?为啥要这样写。因为一般的语言class里都只是声明语法,虽然scala
之类的语言也可以执行代码,但不知道ruby的这种写法有什么应用场景。
天蓬老师2017-04-22 09:01:56
attr_accessor
Générer des méthodes getter et setter. De même, attr_reader
génère des getters et attr_writer
génère des setters. Dans Ruby, il est courant d'exécuter des méthodes spéciales dans une classe. Ces méthodes sont généralement utilisées pour modifier (ou ajouter) certaines fonctionnalités de la classe. 巴扎黑2017-04-22 09:01:56
1.String est une variable en ruby Le symbole est une constante
2. 1 et 2 sont identiques. @ est un membre de classe. Il est très courant dans Ruby de fournir plusieurs façons d'appeler une méthode
.
3. Équivalent à fournir la méthode getter/setert par défaut
伊谢尔伦2017-04-22 09:01:56
Votre question est contextuelle, je vous répondrai à l'envers, vous la comprendrez peut-être mieux :)
Exécutez le code et voyez les résultats. Comprenez simplement. attr_accessor est une méthode. Après exécution, la méthode sera ajoutée dynamiquement à la classe.
C'est de la métaprogrammation en Ruby. Très génial a dit :
module Mod
attr_accessor(:one, :two)
end
Mod.instance_methods.sort #=> [:one, :one=, :two, :two=]
L'exemple de attr_accessor utilise tout à l'heure un symbole (commençant par deux points).
Pourquoi ne pas utiliser des ficelles ? Parce que de nombreuses méthodes doivent être générées à l’aide de cette méthode, et qu’une méthode est un symbole, pas une chaîne. Plus en détail, j'ai découvert la différence entre un symbole et une chaîne lorsque j'écrivais mon propre interpréteur Lisp. Étant donné que Ruby prend en charge la métaprogrammation, il introduit certains concepts de compilateur pour améliorer la flexibilité du langage. C'est vraiment génial.
C'est-à-dire que les méthodes de classe et les méthodes d'instance doivent être distinguées. Méthode de classe par rapport à la méthode membre.De nombreuses autres langues prennent également en charge cette différence.
En bref, la méthode de classe peut être appelée sans instanciation, tandis que la méthode membre doit être instanciée avant de pouvoir être appelée.
class foo def bar end end
foo.new.bar #调用实例方法,必须先new
class foo def self.bar end end
foo.bar #无需实例化
ref:http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/
高洛峰2017-04-22 09:01:56
Les méthodes de Ruby sont toutes appelées via un objet. L'objet est appelé le récepteur de la méthode. La méthode de l'objet est définie dans la classe à laquelle l'objet appartient.
Comment déterminer le destinataire d’une méthode ? Les principes suivants peuvent être suivis.
1. Lorsqu'il est appelé explicitement, le récepteur est évidemment l'objet que vous avez donné.
2. Méthodes appelées implicitement dont le récepteur est soi.
3.soi fait référence à :
(1) Au sein d'un module/classe, self fait référence au module/classe (les modules/classes Ruby sont également des objets). Comme
classe MaClasse
self #Ici self est l'objet MyClass
fin
(2) Dans la méthode, self fait référence au destinataire de la méthode. Comme
méthode def
self #Ici, self est le récepteur
utilisé lors de l'appel de cette méthode
#Il est déterminé lorsque la méthode est appelée
fin
Celles commençant par @ sont des variables d’instance, qui sont deux choses différentes des méthodes.
Il y a tellement de connaissances sur Ruby qu’il est difficile de l’expliquer clairement en quelques mots. Ce qui est mentionné ici n’est que la pointe de l’iceberg. Ruby possède un système logique très rigoureux et complet.
天蓬老师2017-04-22 09:01:56
attr_accessor est une déclaration
Laissez-moi d'abord finir d'apprendre la grammaire