我正在尝试创建一个接受用户输入的方法。它将用户输入转换为整数,然后从用户输入中减去一个。如果用户输入不是数字,它也返回-1。但是测试会引发错误。
describe '#input_to_index' do
it 'converts a user_input to an integer' do
user_input = "1"
expect(input_to_index(user_input)).to be_a(Fixnum)
end
it 'subtracts 1 from the user_input' do
user_input = "6"
expect(input_to_index(user_input)).to be(5)
end
it 'returns -1 for strings without integers' do
user_input = "invalid"
expect(input_to_index(user_input)).to be(-1)
end
end
这是我的方法:
def input_to_index(user_input)
user_input = user_input.to_i
user_input = user_input - 1
return -1 if !user_input.is_a? Numeric
end
答案 0 :(得分:3)
这是因为您只返回if !user_input.is_a?(Numeric)
内容并且已经将user_input
转换为整数。
-1 if false # => nil
-1 if true # => -1
因此方法的最后一行返回nil
,因为永远不会满足条件。
"a".to_i # => 0
"a".to_i.is_a?(Numeric) # => true
("a".to_i - 1).is_a?(Numeric) # => true
你根本不需要最后一行,事情会很好:
def input_to_index(user_input)
user_input = user_input.to_i
user_input = user_input - 1
end
input_to_index("1") # => 0
input_to_index("6") # => 5
input_to_index("invalid") # => -1
更简洁:
def input_to_index(user_input)
user_input.to_i - 1
end
input_to_index("1") # => 0
input_to_index("6") # => 5
input_to_index("invalid") # => -1
答案 1 :(得分:1)
我确信有更有说服力的方法可以做到这一点,但你可以这样做:
def input_to_index(user_input)
user_input = user_input.to_i
user_input = user_input - 1
if !user_input.is_a? Numeric
-1
else
user_input
end
end
修改强>
这可能是一种更有说服力的方式:
def input_to_index(user_input)
user_input = user_input.to_i - 1
!user_input.is_a?(Numeric) ? -1 : user_input
end
以下是最有说服力的方法:
def input_to_index(user_input)
user_input.to_i - 1
end
Credit:Simple Lime