测试回文

时间:2012-05-29 04:53:30

标签: ruby testing palindrome

我正在尝试在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>'

1 个答案:

答案 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符合字母,数字和下划线;你确定这是你想要的吗?