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

Swa*_*y g 75 ruby ruby-on-rails

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

def self.METHOD_NAME
end
Run Code Online (Sandbox Code Playgroud)

要不就:

def METHOD_NAME
end
Run Code Online (Sandbox Code Playgroud)

在任何Rails模型中."self"是Java中的私有修饰符吗?什么时候应该使用它,何时不使用?万分感谢.

Dan*_*man 122

def self.method_name
end
Run Code Online (Sandbox Code Playgroud)

定义一个类方法.

def method_name
end
Run Code Online (Sandbox Code Playgroud)

定义实例方法.

是一个非常好的帖子.


kru*_*.ar 36

快速解释这意味着什么:

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

a = "hello"

def a.informal
  "hi"
end

a.informal
=> "hi"
Run Code Online (Sandbox Code Playgroud)

当你这样做时会发生的是,对象a,它是类String,它的类被改为一个"幽灵"类,即元类,单例类或本征类.那个新的类超类是String.

另外,在类定义中,self设置为正在定义的类,所以

class Greeting
  def self.say_hello
    "Hello"
  end
  #is the same as:
  def Greeting.informal
    "hi"
  end
end
Run Code Online (Sandbox Code Playgroud)

什么情况存在的对象Greeting,这是阶级的Class,获取新的方法新的元类,所以当你打电话

Greeting.informal
=> "hi"
Run Code Online (Sandbox Code Playgroud)

ruby中没有类方法,但语义相似.


bra*_*ntz 11

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

  • 如果方法依赖于对象的任何内部状态,或者必须知道它正在寻址的对象的哪个实例,那么不要使它成为class(self.)方法.
  • 如果该方法不依赖于对象的状态,或者具有该对象的特定实例,那么可以将其作为类方法.

在创建类方法时,请仔细考虑它所属的类或模块.如果您发现自己在类中的类方法中复制代码,请将其分解为其他类可能混合的模块.


Lol*_*ath 6

在这种情况下 - def self.method_name使它等同于Java静态方法:

红宝石:

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

use: HexHelper.to_h(12345)
Run Code Online (Sandbox Code Playgroud)

Java的:

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

use: HexHelper.toHex(12345)
Run Code Online (Sandbox Code Playgroud)


the*_*zer 6

自我永远是当前的对象

当你在这里看到自我

def self.method_name结束

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