2013-02-24 33 views
13
def test 
    "Hello World" 
end 

p method(:test).call #"Hello World" 
p method("test").call #"Hello World" 

Câu hỏi của tôi là: điều gì sẽ xảy ra khi chúng ta chuyển biểu tượng cho phương thức call? Ruby sẽ chuyển đổi ký hiệu thành một String và sau đó thực hiện nó? Nếu vậy, thì mục đích của nó là gì?Hiểu phương pháp Ruby #call

Và nếu không, thì điều gì thực sự xảy ra? Bạn có thể vui lòng xây dựng? Xin lỗi nếu tôi không tự làm rõ.

+0

Bất cứ điều gì được thực hiện nội bộ với Ruby trong C. Nó không quan trọng. – sawa

Trả lời

14

Khi bạn thực hiện def test ... bên ngoài của bất kỳ lớp rõ ràng hoặc định nghĩa module, bạn là chủ yếu trong bối cảnh lớp Object, vì vậy test hiện nay là một phương pháp thể hiện của Object

Trong irb ...

1.8.7 :001 > def test 
1.8.7 :002?> "Hello world" 
1.8.7 :003?> end 
=> nil 
1.8.7 :004 > Object.instance_methods.sort 
=> ["==", "===", "=~", "__id__", "__send__", "class", "clone", "display", "dup", "enum_for", "eql?", "equal?", "extend", "freeze", "frozen?", "hash", "id", "inspect", "instance_eval", "instance_exec", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method", "methods", "nil?", "object_id", "private_methods", "protected_methods", "public_methods", "respond_to?", "send", "singleton_methods", "taint", "tainted?", "tap", "test", "to_a", "to_enum", "to_s", "type", "untaint"] 

method là một phương pháp thể hiện của lớp Object được thừa hưởng bởi tất cả mọi thứ về cơ bản. Khi bạn gọi method bên ngoài bất kỳ lớp rõ ràng hoặc định nghĩa mô-đun nào, về cơ bản bạn gọi nó là phương thức của lớp Object và lớp đó chính là một cá thể của Class, là lớp con của Object (xin lỗi - tôi biết đó là hơi khó hiểu).

Vì vậy - phương pháp method lấy một chuỗi hoặc một biểu tượng và trả về một đối tượng đóng gói phương thức liên kết của tên đó trên cùng một đối tượng mà .method được gọi. Trong trường hợp này, đó là phương pháp test được liên kết với đối tượng Object.

method(:test).call có nghĩa là gọi phương thức testObject là những gì bạn đã xác định trước đây qua def test ....

+0

@MisterCal Từ bàn điều khiển irb, 'Object.class' => Class. –

+0

Ah! Đã xóa. Tôi đã giả định dựa trên thực tế là Object là một siêu lớp của Class. Tôi thấy bây giờ, chút bối rối haha. – MisterCal

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