没有文件说符号不能有大写字母。因为它使我的代码具有良好的可读性,使用符号作为字符串,特别是常量我想这样做。这有效:
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
有关。
答案 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()}"