使用自我。 或者不在.. 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说明符的函数。