2012-06-28 38 views
9

Tôi có một lớp chứa phương thức lớp này:Ruby: Tôi có thể sử dụng các phương thức ví dụ bên trong một phương thức lớp không?

def self.get_event_record(row, participant) 
    event = Event.where(
     :participant_id => participant.id, 
     :event_type_code => row[:event_type], 
     :event_start_date => self.format_date(row[:event_start_date]) 
).first 

    event = Event.new(
     :participant_id => participant.id, 
     :event_type_code => row[:event_type], 
     :event_start_date => self.format_date(row[:event_start_date]) 
) if event.blank? 

    event 
end 

Và tôi cũng có, trong cùng một lớp, một phương pháp dụ:

def format_date(date) 
    parsed_date = date.split('/') 

    # if month or day are single digit, make them double digit with a leading zero 
    if parsed_date[0].split("").size == 1 
    parsed_date[0].insert(0, '0') 
    end 
    if parsed_date[1].split("").size == 1 
    parsed_date[1].insert(0, '0') 
    end 

    parsed_date[2].insert(0, '20') 

    formatted_date = parsed_date.rotate(-1).join("-") 
    formatted_date 
end 

tôi nhận được một 'phương pháp xác định' lỗi cho #format_date. (Trước tiên, tôi đã thử nó trước self). Bạn có thể không sử dụng các phương thức thể hiện trong các phương thức lớp của cùng một lớp không?

+2

Tại sao 'format_date' là một phương pháp thể hiện? Nó không sử dụng bất cứ thứ gì từ ví dụ. – tdgs

+0

Tất nhiên, bạn không thể. Để gọi một phương thức cá thể, bạn cần một cá thể của lớp của bạn. –

+0

@tdgs Điểm tốt. Tôi đã làm cho nó một phương pháp thể hiện bởi vì tôi nghĩ rằng làm cho nó một phương pháp lớp sẽ ngụ ý nó đã được sử dụng công cộng, khi trường hợp là nó chỉ để sử dụng nội bộ –

Trả lời

22

Câu trả lời ngắn gọn là không, bạn không thể sử dụng các phương thức thể hiện của lớp bên trong một phương thức lớp s bạn có một cái gì đó như:

class A 
    def instance_method 
    # do stuff 
    end 

    def self.class_method 
    a = A.new 
    a.instance_method 
    end 
end 

Nhưng theo như tôi có thể thấy, format_date không phải là một phương pháp thể hiện. Vì vậy, ghi định dạng_date như

def self.format_date(date) 
    # do stuff 
end 
+0

Tôi có một phương pháp thể hiện bởi vì được gọi là từ một xác nhận hợp lệ, và một phương pháp lớp hơn là tốt để có thể gọi phương pháp dụ, để được DRY –

+0

Sau đó làm một cái gì đó như thế này 'lớp A; def instance_method; self.class.class_method; kết thúc; def self.class_method; - làm công cụ -; kết thúc; kết thúc' – tdgs

3

Bạn có thể làm YourClassName.new.format_date(your_date), mặc dù tôi nghĩ rằng nó khá rõ ràng bạn nên tái cấu trúc mã của bạn - phương pháp này có thể không thuộc về một cá thể. Tại sao bạn không mở rộng Lớp ngày hoặc tạo format_date một phương thức lớp học trên lớp bạn đang sử dụng?

EDIT: Dưới đây là một vài điều khác để suy nghĩ về với mã của bạn:

  • toàn bộ phương pháp format_date của bạn đi đến rất nhiều độ dài để thao tác ngày như dây đàn. Tại sao không sử dụng Date Date của Ruby? Sử dụng Date.parse hoặc Date.strptime hoặc thậm chí "01/01/2001".to_date có thể có ích tùy thuộc vào miền địa phương của bạn
  • xem xét mở rộng lớp String cho phương pháp của bạn, nếu bạn thực sự cần phải thực hiện phương pháp riêng của bạn:

    class String 
        def to_friendly_formatted_date 
        Date.strptime(self, "%d/%m/%y") 
        end 
    end 
    "01/08/09".to_friendly_formated_date 
    
  • phương pháp lớp học của bạn đang khóc của chúng tôi cho các phương pháp find_or_initialize_by helper:

    self.get_event_record(row, participant) 
        find_or_initialize_by_participant_id_and_event_type_code_and_event_start_date(:participant_id => participant.id, :event_type_code => row[:event_type_code], :event_start_date => row[:event_start_date].to_friendly_formatted_date) 
    end 
    

By thần đó là dài, nhưng nó đạt được những gì bạn đang cố gắng để làm thanh lịch hơn (mặc dù tôi là mở cửa cho lập luận!)

+0

Ban đầu tôi đã có nó như là một phương pháp lớp, nhưng, tôi đã suy nghĩ (có thể sai lầm) rằng các phương thức lớp được sử dụng bên ngoài lớp, trong khi phương pháp này là một phương pháp nội bộ. –

+0

Tôi nghĩ rằng suy nghĩ * là * sai lầm! Các phương thức thể hiện nên liên quan đến các thuộc tính cụ thể của một cá thể của lớp đó. Phương pháp của bạn thực sự không có gì để làm với một ví dụ ở tất cả. Tôi sẽ biến nó thành một phương thức lớp. Bạn cũng có một vài cơ hội để xác định lại mã của mình - Tôi sẽ chỉnh sửa câu trả lời của mình. –

+0

@steve_gallagher: Bạn có thể đặt các phương thức lớp riêng tư. Hãy xem [this] (https://gist.github.com/3011405) gist. – Linuxios

4

Chỉ cần tạo phương pháp lớp

def self.format_date (..) 
    ... 
end 

Và nếu u cần phương pháp dụ, ủy nó để phương pháp lớp

def format_date *args 
    self.class.format_date *args 
end 

Và tôi không nghĩ rằng nên gọi các phương pháp thể hiện từ phạm vi lớp học

+1

'class.format_args'? Tại sao bạn gọi một phương thức lớp trên lớp 'jeyword '? – Linuxios

+0

vì format_date là phương thức lớp –

+2

Điều đó không có nghĩa là gọi nó trên từ khoá 'lớp' sẽ làm bất cứ điều gì nhưng có lỗi cú pháp. Bạn cần 'self'. – Linuxios

Các vấn đề liên quan