在 ruby 2.0 中无法将关键字参数值分配给 ivars

Trouble assigning keyword argument values to ivars in ruby 2.0

我正在尝试使用具有默认值的关键字参数为 ruby 2.1.5 中的 class 编写构造函数,但是对实例变量的赋值似乎不起作用:

class Base
  attr_accessor :name

  def initialize name: "void",
                 contents: []

    @name          = name
    @contents      = contents
  end
end

在我的 rspec 测试中:

it 'should take optional param name' do
  subject { Base.new(name: "fnordland") }
  expect(subject.name).to eq "fnordland"
end

像这样失败:

2) Base initialize should take optional param location_name
 Failure/Error: expect(subject.name).to eq "fnordland"

   expected: "fnordland"
        got: "void"

   (compared using ==)

初始化程序在 IRB 中按预期工作,但测试失败。 我从骨子里知道这可能是非常小而且完全愚蠢的事情,但我很困惑 - ruby 2.1 中将关键字参数分配给 ivars 的示例似乎表明这应该有效。

您的测试用例的顺序似乎有问题。使用 RSpec DSL,有时会有点混淆什么可以去哪里。您需要执行以下任一操作:

it 'should take optional param name' do
  base = Base.new(name: "fnordland")
  expect(base.name).to eq "fnordland"
end

或:

subject { Base.new(name: "fnordland") }
it { expect(subject.name).to eq "fnordland" }