2

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

1 回答 1

3

您正在调用palindrome?它,就好像它是当前规范对象上的一个方法一样,但是您已经对其进行了猴子补丁以在 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

请注意,您使用\wwhich 将匹配字母、数字和下划线;你确定这是你想要的吗?

于 2012-05-29T04:58:43.223 回答