Tôi đang cố gắng tạo các phương thức trợ giúp riêng cho các chức năng mô-đun không có kết quả. Tôi cảm thấy như có một cái gì đó rất đơn giản tôi đang mất tích.Truy cập các phương thức riêng tư từ các chức năng mô-đun trong Ruby
dụ cập nhật với một trường hợp sử dụng dễ hiểu hơn:
module FancyScorer
module_function
def score(ary)
scores = []
ary.each_slice(2).with_index do |slice, i|
scores <<
case i % 2
when 0
score_eventh(ary)
else
score_oddth(ary)
end
end
scores.inject(:+)
end
private
def score_eventh(ary)
ary.inject(:+)/(ary.size - 1)
end
def score_oddth(ary)
ary.inject(:*)/(ary.size - 1)
end
end
FancyScorer.score([1,2,3,4])
# => `block in score_curiously': undefined method `score_eventh'
# for FancyScorer:Module (NoMethodError)
Lưu ý: Các phương pháp riêng nên vẫn tin.
Đây là trường hợp sử dụng: có một số mô-đun có chứa các kỹ thuật tính điểm khác nhau, ví dụ: FancyScorer
, SimpleScorer
, ComplexScorer
. Các hàm này được kiểm tra độc lập và sau đó được sử dụng để tạo phương thức score
cho các lớp khác nhau. Ví dụ:
class A
...
def score
FancyScorer.score(metrics) + 2*SimpleScorer.score(metrics)
end
end
class B
...
def score
0.5*FancyScorer.score(metrics) + 2*SimpleScorer.score(metrics[0,3]) + ComplexScorer.score(metrics)
end
end
dụ trước không có trường hợp sử dụng cung cấp:
module Party
module_function
def pooper
enjoy
end
private
def enjoy
puts "Wahoo!"
end
end
Party.pooper
# => NameError: undefined local variable or method `enjoy' for Party:module
# from (party): in `pooper`
Bạn có một chút của một [XY vấn đề] (http://www.perlmonks.org/?node_id=542341) ở đây. Bạn nên giải thích vấn đề thực tế của bạn. Việc gọi các phương thức trực tiếp trên mô-đun là không bình thường. – naomik
Ví dụ được trình bày là rất giả tạo. Tôi đang triển khai mẫu thiết kế được Corey Haines và Gary Bernhardt quảng bá (cái mà Bernhardt gọi là "lõi chức năng và vỏ bắt buộc"), và trong một số trường hợp, tôi yêu cầu không gian tên để tránh xung đột. – fny
@faraz Bạn đã nhận? –