符号作为Ruby中的常量

时间:2018-03-12 21:46:23

标签: ruby rspec

没有文件说符号不能有大写字母。因为它使我的代码具有良好的可读性,使用符号作为字符串,特别是常量我想这样做。这有效:

describe 'Stack Overflow' do
  let(:stack_overflow) { true }

  it 'Interpolation works' do
    puts "Stack Overflow is helpful: #{stack_overflow}"
  end
end

# >> Stack Overflow is helpful: true

这不起作用:

describe 'Stack Overflow' do
  let(:STACK_OVERFLOW) { true }

  it 'Interplation does not work' do
    puts "Stack Overflow is helpful: #{STACK_OVERFLOW}"
  end
end

# >> NameError:
     uninitialized constant STACK_OVERFLOW

我无法弄清楚为什么我不能在符号名称中使用大写字母(并让它进行插值),或者如果问题与使用rspec的let有关。

2 个答案:

答案 0 :(得分:4)

RSpec的let定义了一个用于规范的memoized helper方法。按照惯例,以大写字母开头的方法名称被视为常量。因此,当您调用STACK_OVERFLOW时,Ruby会尝试查找具有该名称的常量 - 您可以通过在其后附加括号来明确告诉Ruby调用该方法:

puts "Stack Overflow is helpful: #{ STACK_OVERFLOW() }"

另外,如果您想在规范中使用常量,可以使用RSpec stub_const

describe 'Stack Overflow' do
  stub_const('STACK_OVERFLOW', true)

  it 'Interpolation should now work' do
    puts "Stack Overflow is helpful: #{ STACK_OVERFLOW }"
  end
end

希望这有帮助!

答案 1 :(得分:4)

let使用您传递给它的名称定义一个方法。因此,在第一个示例中,您定义了一个名为stack_overflow的方法,并在字符串插值中调用它。

在第二个示例中,您定义了一个名为STACK_OVERFLOW的方法,但调用该方法! STACK_OVERFLOW取消引用一个常量,如果你想让Ruby把它当作一个方法调用,你必须通过添加一个接收器或一个参数列表或两者来明确它是一个方法调用(因为只有方法调用)可以有一个接收者或参数列表):

puts "Stack Overflow is helpful: #{self.STACK_OVERFLOW}"
puts "Stack Overflow is helpful: #{STACK_OVERFLOW()}"
puts "Stack Overflow is helpful: #{self.STACK_OVERFLOW()}"