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

現在のspecオブジェクトのメソッドであるかのように呼び出しpalindrome?ていますが、Stringで定義するためにmonkeypatchedしています。文字列引数を取るメソッド定義したことを除いて。

書かれているように、あなたは書く必要があるでしょう:

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文字、数字、アンダースコアに一致するものを使用していることに注意してください。これがあなたが望むものであると確信していますか?

于 2012-05-29T04:58:43.223 に答える