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 test
là Object
là những gì bạn đã xác định trước đây qua def test ...
.
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