【问题标题】:Testing palindromes测试回文
【发布时间】:2012-05-29 04:53:29
【问题描述】:

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

【问题讨论】:

  • 根据问题的性质和措辞以及您的错误中grader 的存在,我假设这是一个家庭作业问题,并已适当地应用了标签。如果我错了,请告诉我。
  • 家庭作业标签现已正式弃用。 meta.stackexchange.com/questions/147100/…

标签: ruby testing palindrome


【解决方案1】:

您正在调用palindrome?,就好像它是当前规范对象上的一个方法,但是您已经对其进行了猴子补丁以在字符串上定义。除了您定义了采用字符串参数的方法。

按照书面规定,您需要编写:

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,它将匹配字母、数字和下划线;你确定这是你想要的吗?

【讨论】:

  • 我们不允许更改测试。但是,我将其修改为在字符串上定义的原因是因为 downcase 和 scan 是 String 类的属性。这不正确吗?是否有其他方法可以访问这两种方法而无需对其进行修补?我仍然无法通过这些测试。
  • @herman5、downcasescanString 的公共 API 的一部分。只要您有权访问该对象,就可以在任何范围内对其调用公共方法。
  • @Phrogz 经过一夜的休息后,您的解释非常有意义。也很容易看出我做错了什么。看起来我不会再像猴子一样扭动字符串了:)
  • @herman5 太好了!很高兴能提供帮助,欢迎来到 Ruby 编程的美妙世界。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
相关资源
最近更新 更多