gpt4 book ai didi

ruby - 方法范围 - 不确定方法应该是实例方法还是类方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:52 25 4
gpt4 key购买 nike

我正在做一个带有预写测试的练习。起初,测试似乎调用了一个名为 to 的方法。在类的一个实例上 SumOfMultiples像这样:

  def test_sum_to_1000
assert_equal 233_168, SumOfMultiples.to(1000)
end

因此,我将我的类(class)编写如下:

class SumOfMultiples
@@multiples = [3, 5]

def initialize *multiples
@@multiples = multiples unless multiples.empty?
end

def self.to num
sum = 0

(0..num-1).each { |e| sum += e if (@@multiples.any? { |m| e % m == 0 }) }
sum
end
end

现在我遇到了调用 to 的测试直接在 SumOfMultiples :

  def test_configurable_7_13_17_to_20
assert_equal 51, SumOfMultiples.new(7, 13, 17).to(20)
end

上面的测试失败了,因为我有 to定义为实例方法,这是让先前的测试通过所需的方法。关于 to 的范围,我是否遇到了根本性的错误?方法?

注意事项

  1. 我不是学生,这是我自己做的事情。

  2. 目前我有 @@multiples定义为全局变量,因为我需要在 initialize 中访问它和 to - 如果我弄错了范围,这可能会改变。

  3. 对于那些想知道的人 - 这个练习的目的是编写一个程序,给定一个数字,可以找到 3 或 5 的所有倍数的总和,直到但不包括该数字.我们还必须允许程序被配置为找到的倍数的总和3 和 5 以外的数字。

在遵循 Alex Tetzlaff 的建议之后

我已经更改了 @multiples 的范围所以它是一个实例变量。起初我跳过了所有测试,除了 test_configurable_7_13_17_to_20。我改变了 to 的范围所以它是一个实例方法——一切都通过了

然后我尝试运行 test_sum_to_1000再次 - 它失败了,因为它看不到 @multiples

接下来我改变了to的范围回到一个类方法,所以现在是self.to我设置了@multiples调用self.class.new - 所以我的全部 SumOfMultiples类现在看起来像:

class SumOfMultiples
@multiples = [3, 5]

def initialize *multiples
@multiples = multiples unless multiples.empty?
end

def self.to num
self.class.new
sum = 0

(0..num-1).each { |e| sum += e if (@multiples.any? { |m| e % m == 0 }) }
sum
end
end

test_configurable_7_13_17_to_20现在失败 undefined method 'to' for #<SumOfMultiples:0x000000010b0198 @multiples=[7, 13, 17]>

TL;DR 我对 to 的范围仍然非常非常困惑方法以及测试到底在寻找什么。

最佳答案

将@@multiples 存储为全局或更精确的“类变量”是一个主要的设计缺陷。

initialize 将被多次调用,并且每次都会为 所有 实例更改 to 方法的行为。

 def test_configurable_7_13_17_to_20
sm1= SumOfMultiples.new(7, 13, 17)
sm2=SumOfMultiples.new(1,2,4)
assert_equal 51, sm1.to(20) # will probably fail
end

所以不要放弃它,因为它是一个练习:尝试使它成为一个实例变量并首先解决第二种情况。然后使用动态创建的实例编写静态方法。

关于ruby - 方法范围 - 不确定方法应该是实例方法还是类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32115332/

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