使用自我。 或者不在.. Rails中

我已经在Ruby编码一段时间了,但我不明白何时使用:

def self.METHOD_NAME end 

要不就:

 def METHOD_NAME end 

在任何Rails模型。 在Java中,“self”是一个类似private的修饰符吗? 我应该什么时候使用,什么时候使用? 万分感谢。

 def self.method_name end 

定义一个类的方法。

 def method_name end 

定义了一个实例方法。

这是一个相当不错的职位。

这是什么意思的快速解释:

在ruby中,你可以定义特定对象的方法:

 a = "hello" def a.informal "hi" end a.informal => "hi" 

当你这样做的时候,会发生什么事情呢,就是String类的对象a将类更改为“ghost”类,又名metaclass,singleton类或者eigenclass。 那个新的类超类是String

另外,在类内部定义中, self被设置为被定义的类,所以

 class Greeting def self.say_hello "Hello" end #is the same as: def Greeting.informal "hi" end end 

会发生什么情况是,类Class的对象Greeting通过新方法获取新的元类,所以当您调用时

 Greeting.informal => "hi" 

ruby中没有类方法,但是语义是相似的。

什么时候使用哪一个好的指导:

  • 如果该方法依赖于对象的任何内部状态,或者必须知道它正在处理哪个对象的实例,那么不要将其设置为类( self. )方法。
  • 如果该方法不依赖于对象的状态,或者具有该对象的特定实例,则可以在该方法中做出类方法。

在创build一个类方法的时候,要仔细考虑它所属的类或模块。如果你总是在类方法中重复使用类方法中的代码,那么把它归入一个其他类可能混合的模块中。

自我永远是当前的客体

当你在这里看到自我

def self.method_name结束

您不在实例方法中,所以self是当前的Class对象。

在这个上下文中 – def self.method_name使它与Java静态方法等价:

ruby:

 class HexHelper def self.to_h(num) sprintf("%x", num) end end use: HexHelper.to_h(12345) 

Java的:

 public class HexHelper { public static String toHex(int num) { return new PrintfFormat("%x").sprintf(num); } } use: HexHelper.toHex(12345) 

自我就像Java中的这个关键字。 它是对当前对象实例的引用。 如果您的模型代码对当前对象执行操作,那么您可能需要一个没有self.method_name说明符的函数。