2017-02-05 65 views
0

問題是用下面的代碼:Ruby不能識別`downcase`或`split`作爲定義的方法嗎?

#write your code here 
def translate phrase 
    phrase = phrase.downcase.split(/ /) 
    phrase.collect! do |word| 
    word = word.split(//) 
    switched = false 
    while switched == false 
     word.each_index do |letter| 
     if word[letter] == ("a" || "e" || "i" || "o" || "u") 
      switched = true 
      word = (word[letter..-1] + word[0..(letter-1)]).join + "ay" 
     end 
     end 
    end 
    end 
    return phrase.join(" ") 
end 

puts translate("chocolate cream") 
#Should return "ocolatechay eamcray" 

當我運行此,紅寶石只返回一個空行。所以,爲了解決這個問題,我把定義加載到了repl中。該REPL返回以下錯誤:如果我從我的代碼刪除downcase

NoMethodError: undefined method `downcase' for #<RubyVM::InstructionSequence:0x000000016e8f88> 
    from /home/adc/odin-project/web-development-101/21-ruby-tdd/ruby_tdd_project/learn_ruby/04_pig_latin/pig_latin.rb:3:in `translate' 
    from /home/adc/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>' 

,我得到同樣的錯誤信息,只有這一次split

這裏有什麼問題? (我敢確信downcasesplit這個問題。)

+0

'phrase'從哪裏來?正如你在錯誤信息中看到的那樣,它不是一個字符串,而是一個[RubyVM :: InstructionSequence](http://ruby-doc.org/core-2.4.0/RubyVM/InstructionSequence.html) –

+0

'phrase'就是'translate'方法的一個參數。我已經嘗試在repl中將'phrase'定義爲一個字符串,但這沒有幫助。 – adc17

回答

1

如果返回一個空字符串,因爲你不回的collect!塊內部的任何物件。返回word,它會工作:

def translate phrase 
    phrase = phrase.downcase.split(/ /) 
    phrase.collect! do |word| 
    word = word.split(//) 
    switched = false 
    while switched == false 
     word.each_index do |letter| 
     if word[letter] == ("a" || "e" || "i" || "o" || "u") 
      switched = true 
      word = (word[letter..-1] + word[0..(letter-1)]).join + "ay" 
     end 
     end 
    end 
    word 
    end 
    return phrase.join(" ") 
end 

puts translate("chocolate cream") 
#=> atechocolay amcreay 

它看起來並不像它的返回你期望什麼,但它仍然不是一個空字符串更好。

至於在控制檯的奇怪的錯誤消息,這似乎是特定於REPL(方法名translate,可能是因爲)。

+0

是的,它看起來好像使用'translate'或'phrase'是拋出錯誤(如果我改變任何一個詞,錯誤去)。謝謝 - 即使代碼尚未按預期工作,這回答了問題。 – adc17

+0

@adc您在單詞循環內分配單詞的問題。在這個例子中給我預期的答案'puts translate(「方法不可用」)'請。 –

+0

@ arm2pro「ethodsmay unavailableay」 – adc17

1

更新1(我怎麼會寫這樣的代碼)

def translate phrase 
    phrase = phrase.downcase.split(/ /) 
    phrase.collect! do |word| 
    word = word.split(//) 

    word.each_index do |letter| 
     if ["a", "e", "i", "o", "u"].include?(word[letter]) 
     if letter == 0 
      word = word[letter..-1].join + "ay" 
     else 
      word = (word[letter..-1] + word[0..(letter-1)]).join + "ay" 
     end 

     break 
     end 
    end 

    word 
    end 

    return phrase.join(" ") 
end 

puts translate("chocolate cream") 

更新2(如果我做你的代碼的一些小的改動,使其有用)

def translate phrase 
    phrase = phrase.downcase.split(/ /) 
    phrase.collect! do |word| 
    word = word.split(//) 
    switched = false 
    while switched == false 
     word.each_index do |letter| 
     if ["a", "e", "i", "o", "u"].include?(word[letter]) 
      switched = true 
      if letter == 0 
      word = word[letter..-1].join + "ay" 
      else 
      word = (word[letter..-1] + word[0..(letter-1)]).join + "ay" 
      end 
      break 
     end 
     end 
    end 
    word 
    end 
    return phrase.join(" ") 
end 

puts translate("chocolate cream") 

說明

  1. "o"==("a" || "e" || "i" || "o" || "u")

    "o"== "a" || "o" == "e" || "o" == "i" || "o" == "o" || "o" == "u"

    陳述是不一樣的。第一個是假的

    (因爲("a" || "e" || "i" || "o" || "u")=="a""o"!="a"),因爲第二個是真實的。

  2. 你需要內部的if語句

    if letter == 0 
        word = word[letter..-1].join + "ay" 
    else 
        word = (word[letter..-1] + word[0..(letter-1)]).join + "ay" 
    end 
    

    因爲當字開頭提到的任一個元音然後

    word[letter..-1] + word[0..(letter-1)]

    語句將返回兩次全詞,引起信將等於0。

  3. 最後一點,你需要返回word物體自動對焦ter while循環。

+0

好的,所以我看到兩個主要的變化。 'word'現在是'letters',直到==最後的單詞被返回,並且你正在使用'break'而不是我的'切換'的想法。如果你能解釋爲什麼這兩個改變是必要的,我會很感激。 – adc17

+0

@adc請參閱我的更新。 –

+0

謝謝@ arm2pro,但我仍然不確定爲什麼我的「開關」的想法不起作用?您的**更新2 **僅適用於「break」。 – adc17

相關問題