Ruby进程和调用方法而不进行示例化

fnvucqvd  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(186)

我试图让粘贴在下面的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

让他们工作!

bvn4nwqk

bvn4nwqk1#

我需要使用.运算符,以便执行NumProcessor.multiply_by
为了在类本身上调用方法,必须定义一个所谓的 class method,例如,通过使用self.作为前缀:(参见方法-范围)

class NumProcessor
  def self.multiply_by(number)
    # ...
  end
end

您现在可以通过以下方式调用它:

NumProcessor.multiply_by(4)

# => #<Proc:...>

如果您不打算创建NumProcessor的示例,则可以将其设置为module

module NumProcessor
  def self.multiply_by(number)
    # ...
  end
end

最后,还有module_function--它将一个公共 * 示例方法 *(没有self.的示例方法)同时转换为类方法和私有示例方法:

module NumProcessor
  def multiply_by(number)
    # ...
  end
  module_function :multiply_by
end

这就是内置Math模块的实现方式。该方法可以作为类方法调用:

NumProcessor.multiply_by(4)

# => #<Proc:...>

但是,您也可以将模块包含到另一个类中,以便在没有显式接收器的情况下调用其方法:

class Foo
  include NumProcessor

  def bar
    multiply_by(4)
  end
end

同时不将其暴露于外部:

foo = Foo.new
foo.bar

# => #<Proc:...>

foo.multiply_by(4)

# NoMethodError: private method `multiply_by' called

关于您的实施:

  • multiply_by =赋值语句是多余的,因为multiply_by变量在之后不会被使用
  • 未使用number参数
  • 尽管它的名称是multiply_by(number),但它总是乘以2(而不是乘以number

要修复它,我将它实现为:(请参阅Proc的文档,其中使用了完全相同的实现作为示例)

def multiply_by(factor)
  Proc.new { |n| n * factor }
end

相应的测试可能如下所示:

describe 'NumProcessor' do
  describe '.multiply_by' do
    let(:multplier) { NumProcessor.multiply_by(factor) }

    context 'with a factor of 2' do
      let(:factor) { 2 }

      it 'should double' do
        expect(multiplier.call(4)).to eq(8)
      end
    end

    context 'with a factor of 3' do
      let(:factor) { 3 }

      it 'should triple' do
        expect(multiplier.call(4)).to eq(12)
      end
    end
  end
end
irtuqstp

irtuqstp2#

通过在方法名称的开头添加self.,将multiply_by更改为类方法。

class NumProcessor
  def self.multiply_by(number)
    multiply_by = Proc.new { |num| num * 2} 
  end
end

这将允许类似NumProcessor.multiply_by(4)的调用

相关问题