2010-01-12 22 views
31

define_method có thể được sử dụng để xác định phương pháp:Làm thế nào để xác định đối số mặc định của phương thức bằng cách sử dụng define_method?

define_method(:m) do |a| 
end 

tương đương như sau:

def m(a=false) 
end 
:

def m(a) 
end 

Tuy nhiên, hình thức tương đương với những điều sau đây sử dụng define_method là gì

Lưu ý rằng tôi cần có thể gọi m() mà không cần đưa ra bất kỳ đối số nào.

Trả lời

44

Điều này thực sự chỉ hoạt động như bạn mong đợi trong Ruby 1.9!

define_method :m do |a = false| 
end 

Nếu bạn cần 1.8 tương thích, nhưng bạn không nhất thiết cần phải đóng cửa để xác định phương pháp của bạn, hãy xem xét sử dụng class_eval với một đối số chuỗi và một cuộc gọi thường xuyên để def:

class_eval <<-EVAL 
    def #{"m"}(a = false) 
    end 
EVAL 

Nếu không hãy làm theo đề xuất trong chuỗi có liên kết với philippe. Ví dụ:

define_method :m do |*args| 
    a = args.first 
end 
+8

Tôi thực sự thích Ruby. "Tôi có thể làm X?", "Có, X hoạt động giống như bạn mong muốn!", "Horray!" – superluminary

5

Hiện tại không thể thực hiện được due to the yacc parser. This thread on Ruby-forum đề xuất một số giải pháp.

class A 
    define_method(:hello) do | name, *opt_greeting| 
     option = opt_greeting.first || Hash.new 
     greeting = option[:greeting] || "hello" 
     puts greeting+" "+name 
    end 
end 


a = A.new 
a.hello "barbara" 
a.hello "Mrs Jones", :greeting => "Good Morning" 
Các vấn đề liên quan