Próbuję utworzyć prywatne metody pomocnicze dla funkcji modułu bez skutku. Czuję, że jest coś bardzo prostego, czego mi brakuje.Uzyskiwanie dostępu do prywatnych metod z funkcji modułu w Ruby
Updated przykład z bardziej zrozumiały przypadku użycia:
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)
Uwaga: Metody prywatne powinny pozostać prywatne.
Oto przypadek użycia: istnieje kilka modułów, które zawierają różne techniki oceniania, np. FancyScorer
, SimpleScorer
, ComplexScorer
. Te funkcje są testowane niezależnie, a następnie są używane do utworzenia metody score
dla różnych klas. Na przykład:
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
poprzednim przykładzie bez przewidzianego przypadku użycia:
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`
Trzeba trochę się problemu [XY] (http://www.perlmonks.org/?node_id=542341) tutaj. Powinieneś wyjaśnić swój faktyczny problem. Nieprawidłowe jest wywoływanie metod bezpośrednio w module. – naomik
Przedstawiony przykład był bardzo wymyślny. Wdrażam wzór promowany przez Corey Hainesa i Gary'ego Bernhardta (co Bernhardt nazywa "funkcjonalnym rdzeniem i imperatywną powłoką"), aw niektórych przypadkach wymagam przestrzeni nazw, aby uniknąć konfliktów. – fny
@faraz Dostałeś teraz? –