Để sử dụng bản thân. hay không .. trong Rails


76

Tôi đã viết mã trong Ruby một thời gian, nhưng tôi không hiểu khi nào sử dụng:

def self.METHOD_NAME
end

hoặc chỉ:

def METHOD_NAME
end

Trong bất kỳ mô hình Rails nào. "Self" có phải là một bổ ngữ giống như private trong Java không? Khi nào tôi nên sử dụng nó và khi nào không ?. Cảm ơn rất nhiều.


5
"self" trong ngữ cảnh này tương ứng với "static" trong Java. Trong trường hợp này, self đang đề cập đến LỚP (trái ngược với Object). Các lớp Ruby cũng có thể có các khai báo riêng tư và được bảo vệ. Ruby cũng sử dụng self làm tham chiếu "this" trong OBJECT INSTANCE.
Toby Hede

Câu trả lời:


126
def self.method_name
end

định nghĩa một phương thức lớp.

def method_name
end

định nghĩa một phương thức thể hiện.

Đây là một bài viết khá tốt về nó.


37

Giải thích nhanh về điều đó có nghĩa là:

Trong ruby, bạn có thể xác định các phương thức trên một đối tượng cụ thể:

a = "hello"

def a.informal
  "hi"
end

a.informal
=> "hi"

Điều gì sẽ xảy ra khi bạn làm điều đó là đối tượng a, thuộc lớp String, bị thay đổi lớp của nó thành lớp "ma", hay còn gọi là siêu kính, lớp singleton hoặc lớp eigenclass. Lớp cha của lớp mới đó là String.

Ngoài ra, các định nghĩa bên trong lớp, selfđược đặt thành lớp đang được định nghĩa, vì vậy

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

Điều gì xảy ra ở đó là đối tượng Greeting, thuộc loại Class, nhận được một siêu kính mới với các phương thức mới, vì vậy khi bạn gọi

Greeting.informal
=> "hi"

Không có cái gọi là phương thức lớp trong ruby, nhưng ngữ nghĩa thì tương tự.


11

Hướng dẫn tốt về thời điểm sử dụng cái nào:

  • Nếu phương thức phụ thuộc vào bất kỳ trạng thái bên trong nào của đối tượng hoặc phải biết thể hiện của đối tượng mà nó đang giải quyết, thì KHÔNG làm cho nó trở thành một self.phương thức class ( ).
  • Nếu phương thức không phụ thuộc vào trạng thái của đối tượng, hoặc có một thể hiện cụ thể của đối tượng, thì trong có thể được tạo thành một phương thức lớp.

Khi tạo một phương thức lớp, hãy suy nghĩ kỹ xem nó thuộc về lớp hoặc mô-đun nào. Nếu bạn từng bắt gặp mình sao chép mã trong các phương thức của lớp giữa các lớp, hãy đưa nó vào một mô-đun mà các lớp khác có thể trộn vào.


6

Trong ngữ cảnh này - def self.method_name làm cho nó tương đương với phương thức tĩnh Java:

ruby:

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

bản thân luôn là đối tượng hiện tại

Khi bạn nhìn thấy bản thân ở đây

def self.method_name end

Bạn không ở trong một phương thức instance, vì vậy self là đối tượng Class hiện tại .


2

self giống như từ khóa this trong Java. Đó là một tham chiếu đến cá thể đối tượng hiện tại. Nếu mã mô hình của bạn thực hiện một hoạt động trên đối tượng hiện tại, thì bạn có thể cần một hàm không có mã định danh self.method_name.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.