我正在尝试在Ruby中创建一个函数来告诉字符串是否是回文。我已经检查过以前的例子但是我找不到通过我的代码上运行的测试的解决方案。这项任务让我们开始使用这段代码。
def palindrome?(string)
# your code here
end
这就是我所做的。
class String
def palindrome?(string)
y = string.downcase.scan(/\w/)
if y == y.reverse
puts "Palindrome"
else
puts "Not a palindrome"
end
end
end
这是测试的结果。
Failure/Error: palindrome?("A man, a plan, a canal -- Panama").should be_true
NoMethodError:
undefined method `palindrome?' for
#<RSpec::Core::ExampleGroup::Nested_1:0x00000002c5e368>
# ./spec.rb:3:in `block (2 levels) in <top (required)>'
# ./lib/rspec_runner.rb:36:in `block in run_rspec'
# ./lib/rspec_runner.rb:32:in `run_rspec'
# ./lib/rspec_runner.rb:23:in `run'
# lib/graders/weighted_rspec_grader.rb:6:in `grade!'
# ./grade:32:in `<main>'
答案 0 :(得分:3)
您正在调用palindrome?
,就好像它是当前规范对象上的方法一样,但您已将其monkeypatched在String上定义。除非您还定义了采用字符串参数的方法。
如上所述,您需要写:
str = "A man, a plan, a canal -- Panama"
str.palindrome?(str).should be_true
...除了你还没有从你的方法返回true
之外,你只需要puts
一个字符串。 (并且puts
始终返回nil
,因此您编写的方法始终返回nil
作为结果,无论是否匹配。)
您可以将代码和测试更改为字符串上的正确方法:
class String
def palindrome?
letters = self.downcase.scan(/\w/)
letters == letters.reverse
end
end
"A man, a plan, a canal -- Panama".palindrome?.should be_true
......或者你必须使它成为一种正确的'全球'方法:
def palindrome?(str)
letters = str.downcase.scan(/\w/)
letters == letters.reverse
end
palindrome?("A man, a plan, a canal -- Panama").should be_true
请注意,您使用的\w
符合字母,数字和下划线;你确定这是你想要的吗?