我已经在Ruby编写了一段时间,但我不明白何时使用:
def self.METHOD_NAME
end
或只是:
def METHOD_NAME
end
在任何Rails模型中。 “self”是Java中的私有修饰符吗?什么时候应该使用它,何时不使用?非常感谢。
答案 0 :(得分:119)
答案 1 :(得分:36)
快速解释这意味着什么:
在ruby中,您可以在特定对象上定义方法:
a = "hello"
def a.informal
"hi"
end
a.informal
=> "hi"
当你这样做时会发生的是,对象a(类String
)将其类更改为“ghost”类,即metaclass,singleton类或eigenclass。新的类超类是String
。
此外,在类定义中,self
设置为正在定义的类,所以
class Greeting
def self.say_hello
"Hello"
end
#is the same as:
def Greeting.informal
"hi"
end
end
对象Greeting
(类Class
)会使用新方法获取新的元类,因此当您调用
Greeting.informal
=> "hi"
ruby中没有类方法,但语义相似。
答案 2 :(得分:11)
何时使用哪一个的好指南:
self.
)方法。在创建类方法时,请仔细考虑它所属的类或模块。如果您发现自己在类中的类方法中重复代码,请将其分解为其他类可能混合的模块。
答案 3 :(得分:6)
在此上下文中 - def self.method_name使其等同于Java静态方法:
红宝石:
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)
答案 4 :(得分:6)
自我总是当前对象
当你在这里看到自己时
def self.method_name 端
您不在实例方法中,因此self是当前的 Class 对象。
答案 5 :(得分:1)
self 与Java中的 this 关键字类似。它是对当前对象实例的引用。如果您的模型代码对当前对象执行操作,那么您可能需要一个没有self.method_name说明符的函数。