我试图让粘贴在下面的RSpec测试通过,但是我不知道应该如何调用multiply_by
。我认为我必须将multiply_by
存储为一个proc,以便可以在expect
行上调用它。但是如果我不示例化NumProcessor
类,我如何访问multiply_by
方法呢?也许我不应该把NumProcessor
作为一个类,但是我需要使用.
操作符,这样我才能执行NumProcessor.multiply_by
,所以我不清楚这一点。我相信,关于ruby中的procs如何工作,我还缺少一些东西。如果有任何指导,我将不胜感激。
# First attempt
class NumProcessor
def multiply_by(num)
multiply_by = Proc.new { |num| num * 2}
end
end
# Trying to write code to make this test pass without changing it
describe 'NumProcessor#multiply_by' do
it 'should double' do
double = NumProcessor.multiply_by(2)
expect(double.call(4)).to eq(8)
end
end
更新的测试
class NumProcessor
def self.multiply_by(factor)
Proc.new { |num| num * factor}
end
end
# Trying to write code to make this test pass without changing it
describe 'NumProcessor#multiply_by' do
it 'should double' do
double = NumProcessor.multiply_by(2)
expect(double.call(2)).to eq(4)
end
it 'should triple' do
triple = NumProcessor.multiply_by(3)
expect(triple.call(2)).to eq(6)
end
end
让他们工作!
2条答案
按热度按时间bvn4nwqk1#
我需要使用
.
运算符,以便执行NumProcessor.multiply_by
为了在类本身上调用方法,必须定义一个所谓的 class method,例如,通过使用
self.
作为前缀:(参见方法-范围)您现在可以通过以下方式调用它:
如果您不打算创建
NumProcessor
的示例,则可以将其设置为module:最后,还有
module_function
--它将一个公共 * 示例方法 *(没有self.
的示例方法)同时转换为类方法和私有示例方法:这就是内置
Math
模块的实现方式。该方法可以作为类方法调用:但是,您也可以将模块包含到另一个类中,以便在没有显式接收器的情况下调用其方法:
同时不将其暴露于外部:
关于您的实施:
multiply_by =
赋值语句是多余的,因为multiply_by
变量在之后不会被使用number
参数multiply_by(number)
,但它总是乘以2(而不是乘以number
)要修复它,我将它实现为:(请参阅
Proc
的文档,其中使用了完全相同的实现作为示例)相应的测试可能如下所示:
irtuqstp2#
通过在方法名称的开头添加
self.
,将multiply_by
更改为类方法。这将允许类似
NumProcessor.multiply_by(4)
的调用