test_module.rbcủa Ruby module_function, phương pháp riêng gọi module, viện dẫn trong phương pháp lớp phong cách trên mô-đun cho thấy lỗi
module MyModule
def module_func_a
puts "module_func_a invoked"
private_b
end
module_function :module_func_a
private
def private_b
puts "private_b invoked"
end
end
class MyClass
include MyModule
def test_module
module_func_a
end
end
Gọi chức năng mô-đun từ lớp
c = MyClass.new
c.test_module
Output 1:
$ ruby test_module.rb
module_func_a invoked
private_b invoked
Gọi chức năng mô-đun trên mô-đun trong phương pháp phong cách lớp
ma = MyModule.module_func_a
Output 2:
module_func_a invoked
test_module.rb:5:in `module_func_a': undefined local variable or method `private_b' for MyModule:Module (NameError)
from test_module.rb:31
Như có thể thấy từ đầu ra 1 và Output 2 khi bao gồm các module trong một lớp, không có vấn đề xảy ra khi phương thức riêng của một mô-đun được gọi từ một hàm mô-đun trong khi trong trường hợp khi trực tiếp gọi hàm mô-đun trên mô đun trong c Kiểu phương thức lass phương thức riêng của module, được gọi từ hàm module, không tìm thấy.
Ai đó có thể làm cho tôi hiểu lý do đằng sau hành vi trên và có gọi chức năng mô-đun (mà lần lượt gọi phương thức riêng của mô-đun) trên mô-đun trong kiểu phương thức lớp không? Nếu có thể, thì những điều chỉnh nào được yêu cầu trong mã của tôi để làm như vậy?
Thanks.This works.I đã thử mở rộng self to MyModule và nó đang hoạt động. Tuy nhiên, dường như trong trường hợp này riêng tư có vẻ thừa và không có tác dụng. Có phải trong trường hợp như đã đề cập, chúng tôi không thể tạo các phương thức riêng tư? Ví dụ: tôi cần tạo một phương thức tiện ích chỉ nên sử dụng bởi mô-đun hoặc chức năng mô-đun và không được tiếp xúc với người dùng của mô-đun –
Bạn không thể và đó là lý do tôi thích sử dụng ủy quyền. – psyho
@pysho - Bạn có thể vui lòng cung cấp cho tôi một ví dụ hoặc cung cấp cho tôi một liên kết cung cấp chi tiết về cách sử dụng ủy quyền mà bạn đã đề cập không? –