IT TIP

자기를 사용합니다.

itqueen 2020. 10. 20. 19:01
반응형

자기를 사용합니다. 아니면 .. Rails에서


지금은 Ruby로 코딩을 해왔지만 언제 사용해야할지 모르겠습니다.

def self.METHOD_NAME
end

또는 그냥 :

def METHOD_NAME
end

모든 Rails 모델에서. "self"는 Java에서 private과 같은 수정 자입니까? 언제 사용하고 사용하지 않습니까?. 엄청 고마워.


def self.method_name
end

클래스 메서드를 정의합니다.

def method_name
end

인스턴스 메서드를 정의합니다.

이것은 그것에 대한 꽤 좋은 게시물입니다.


이것이 의미하는 바에 대한 간략한 설명 :

루비에서는 특정 객체에 대한 메소드를 정의 할 수 있습니다.

a = "hello"

def a.informal
  "hi"
end

a.informal
=> "hi"

그렇게 할 때 무슨 일이 일어나는가는 클래스의 a 객체 String가 "고스트"클래스, 일명 메타 클래스, 싱글 톤 클래스 또는 고유 클래스로 변경되는 것입니다. 새로운 클래스 수퍼 클래스는 String.

또한 클래스 정의 내에서 정의 self되는 클래스로 설정되므로

class Greeting
  def self.say_hello
    "Hello"
  end
  #is the same as:
  def Greeting.informal
    "hi"
  end
end

무슨 일이 일어나는가는 Greetingclass 의 객체 Class가 새로운 메소드를 가진 새로운 메타 클래스 를 얻는 것입니다.

Greeting.informal
=> "hi"

루비에는 클래스 메소드와 같은 것이 없지만 의미는 비슷합니다.


어느 것을 사용해야하는지에 대한 좋은 가이드 :

  • 메서드가 개체의 내부 상태에 의존하거나 주소를 지정하는 개체의 인스턴스를 알아야하는 경우 클래스 ( self.) 메서드로 만들지 마십시오 .
  • 메서드가 객체의 상태에 의존하지 않거나 객체의 특정 인스턴스를 갖는 경우 in은 클래스 메서드가 될 수 있습니다.

클래스 메서드를 만들 때 어떤 클래스 또는 모듈에 속하는지 신중하게 생각하십시오. 클래스간에 클래스 메서드에서 코드를 복제하는 것을 발견 한 경우 다른 클래스가 섞일 수있는 모듈로이를 팩터링하십시오.


이 컨텍스트에서-def self.method_name은 Java 정적 메소드와 동일하게 만듭니다.

루비:

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

use: HexHelper.to_h(12345)

자바:

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

use: HexHelper.toHex(12345)

self는 항상 현재 객체입니다.

여기에서 자아를 볼 때

def self.method_name end

인스턴스 메소드에 있지 않으므로 self는 현재 Class 객체입니다.


selfJava this 키워드 와 같습니다 . 현재 개체 인스턴스에 대한 참조입니다. 모델 코드가 현재 개체에 대해 작업을 수행하는 경우 self.method_name 지정자가없는 함수가 필요할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/386115/to-use-self-or-not-in-rails

반응형