我有这个简单的方法
def is_palindrome?(sentence)
raise ArgumentError.new('expected string') unless sentence.is_a?(String)
safe_sentence = sentence.gsub(/\W+/, '').downcase
return safe_sentence == safe_sentence.reverse
end
is_palindrome?"rails"
当我运行它时,我在第4行得到错误void value expression
,这是返回语句
这里有什么问题?
答案 0 :(得分:5)
我知道这已经拖了很久但是我注意到这个问题没有答案,因为我正在研究这个完全相同的问题。我很久以前就遇到了同样的错误,这个错误意味着Ruby正在尝试在代码中找到conditions change
并找不到它。这可能是因为Ruby没有正确地读取您的代码,或者可能是因为某处存在错误。修复它实际上非常容易。
def is_palindrome?(sentence)
raise ArgumentError.new('expected string') unless sentence.is_a?(String)#<= Right here at 'unless' condition is changed
safe_sentence = sentence.gsub(/\W+/, '').downcase
return safe_sentence == safe_sentence.reverse
end
is_palindrome?"rails"
出于某种原因,您的Ruby版本试图找到条件更改并默认为原始条件,需要进行大量研究才能提出。
那你怎么解决这个问题呢?快速回答是添加if/else statement
而不是unless
:
def is_palindrome?(word)
to_rev = word.split('')
rev_arr = to_rev.reverse
new_word = rev_arr.join('')
if new_word == word
return true
else
return false
end
end
is_palindrome?("racecar") #<= Returns true
is_palindrome?("test") #<= Returns false
如果您想使用正则表达式:
def is_palindrome?(sentence)
new_sentence = sentence.gsub(/\W+/, '').downcase.reverse
if new_sentence == sentence.downcase
return true
elsif new_sentence != sentence.downcase
return false
else
raise ArgumentError.new("String expected, instead found #{sentence}")
end
end
is_palindrome?("racecar") #<= Returns true
is_palindrome?("test") <= Returns false
这是完全未经测试的但你明白了。这将增加条件的变化,并允许Ruby意识到条件发生了变化。
现在为什么你的系统会输出这个?简短的回答是,没有人真正知道,可能是你的系统中有一个错误,可能是你的某个版本的Ruby已经损坏了。
你可以尝试几件事:
人们无法重现此错误的原因可能是因为没有人能真正看到您运行该程序的方式,也许您有不同版本的Linux或Windows,无论如何。希望这能回答你的问题..