要使用自我。是否在Rails中


76

我已经在Ruby中编码了一段时间了,但是我不知道何时使用:

def self.METHOD_NAME
end

要不就:

def METHOD_NAME
end

在任何Rails模型中。“ self”是否像Java中的private那样修饰符?我什么时候应该使用它,什么时候不使用?万分感谢。


5
在这种情况下,“ self”对应于Java中的“ static”。在这种情况下,self是指CLASS(而不是Object)。Ruby类也可以具有私有和受保护的声明。Ruby在对象实例中也将self用作“ this”引用。
Toby Hede

Answers:


126
def self.method_name
end

定义一个类方法。

def method_name
end

定义一个实例方法。

是一个很好的帖子。


37

快速解释一下这是什么意思:

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

a = "hello"

def a.informal
  "hi"
end

a.informal
=> "hi"

当您执行此操作时,将发生的事情是将a类的对象aString的类更改为“ ghost”类,aka元类,单例类或本征类。那个新类超类是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中没有类方法之类的东西,但是语义是相似的。


11

关于何时使用哪个的一个很好的指南:

  • 如果该方法取决于对象的任何内部状态,或者必须知道该对象正在寻址的对象的实例,则不要使其成为类(self.)方法。
  • 如果该方法不依赖于对象的状态或不具有对象的特定实例,则可以使用类方法。

制作类方法时,请仔细考虑它属于哪个类或模块。如果您发现自己在跨类的类方法中复制代码,请将其分解为其他类可以混入的模块。


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)

6

自我永远是当前的对象

当你在这里看到自己

def self.method_name结尾

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


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.