gpt4 book ai didi

ruby - 从 Ruby 中的模块函数访问私有(private)方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:04:19 26 4
gpt4 key购买 nike

我正在尝试为模块函数创建私有(private)辅助方法,但无济于事。我觉得我缺少一些非常简单的东西。

更新的示例具有更易于理解的用例:

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)

注意:私有(private)方法应保持私有(private)。

这是用例:有几个模块包含各种评分技术,例如FancyScorerSimpleScorerComplexScorer。这些函数是独立测试的,然后被用来为不同的类创建一个score方法。例如:

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

没有提供用例的先前示例:

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`

最佳答案

module_function(symbol, ...) → self说:-

Creates module functions for the named methods. These functions may be called with the module as a receiver, and also become available as instance methods to classes that mix in the module. Module functions are copies of the original, and so may be changed independently. The instance-method versions are made private. If used with no arguments, subsequently defined methods become module functions.

您需要确保将辅助方法声明为 #private_class_method:private 仅影响实例方法。

module Party

def enjoy
puts 'hello'
end

def pooper
enjoy
end

private_class_method :enjoy
module_function :pooper
end

Party.pooper # => 'hello'
Party.enjoy # => private method `enjoy' called for Party:Module (NoMethodError)

此外,您应该注意可访问性关键字的顺序,例如 publicprivatemodule_function这些不重叠,而是覆盖。

module Party
module_function # Module function declarations begin
def pooper
bar
end
def bar
enjoy
end

private # Private declarations begin, module function declarations end
module_function # Private declarations end, module function declarations begin
def enjoy # Therefore, this is a module function
"Wahoo!"
end
end

Party.pooper # => "Wahoo!"
Party.bar # => "Wahoo!"
Party.enjoy # => "Wahoo!" <-- No longer private

注意这里 module_function 覆盖了之前的 private 声明。


这里有更多示例 module_function 何时会完成其工作,何时不会。

一旦弹出另一个可访问性关键字,module_function 定义就会停止。在此示例中,module_functionpublic 中断,使 #pooper 成为公共(public)实例方法。使用 private 会类似地阻止 module_method

module Party
module_function
public
def pooper
"i am pooper"
end
end

Party.pooper
# undefined method `pooper' for Party:Module (NoMethodError)

现在如果顺序改变了:

module Party
public
module_function
def pooper
"i am pooper"
end
end

Party.pooper # => "i am pooper"

关于ruby - 从 Ruby 中的模块函数访问私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18518575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com