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

时间:2008-12-22 12:14:43

标签: ruby-on-rails ruby

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

def self.METHOD_NAME
end

或只是:

def METHOD_NAME
end

在任何Rails模型中。 “self”是Java中的私有修饰符吗?什么时候应该使用它,何时不使用?非常感谢。

6 个答案:

答案 0 :(得分:119)

def self.method_name
end

定义了一个类方法。

def method_name
end

定义了一个实例方法。

This是一篇非常好的帖子。

答案 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说明符的函数。