2012-05-29 25 views
2

我試圖在Ruby中作出函數,告訴如果一個字符串是迴文。我已經檢查了以前的例子,但是我找不到通過我的代碼上運行的測試的解決方案。這個任務以這一小段代碼開始。測試palindromes

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

根據問題的性質和措辭和grader'的'在錯誤的存在,我假定這是一個家庭作業的問題,並適當應用的標籤。如果我錯了,請告訴我。 – Phrogz

+0

作業標籤現在正式被棄用。 http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated –

回答

3

要調用palindrome?,彷彿它就是當前規範對象的一個​​方法,但你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將匹配字母,數字,一d強調;你確定這是你想要的嗎?

+0

我們不允許改變測試。然而,我把它定義在string上的原因是因爲downcase和scan是類String的屬性。這是不正確的?有沒有其他方法可以在不修飾它的情況下訪問這兩種方法?我仍然無法通過這些測試。 – Anconia

+2

@ herman5,'downcase'和'scan'是String的公共API的一部分。只要你有權訪問該對象,就可以從任何範圍調用它的公共方法。 –

+0

@Phrogz休息一晚後,你的解釋會產生巨大的意義。也很容易看出我做錯了什麼。看起來像我不會猴子扭傷字符串:) – Anconia