2

申し訳ありませんが、「Pig Latin」メソッドを作成するための TestFirst.org Ruby 演習について、初心者からの別の質問です。他の回答は多少役に立ちましたが、うまく適応させることができませんでした。主な問題は、単語の文字列 (単一の単語だけでなく) をスキャンし、単語の一部を変更し (該当する場合)、完全な文字列を返すメソッドを作成しようとしていることです。

以下は、演習の最初の部分を実行しようとする私のコードです。これは、母音で始まる単語に「ay」を追加することです。しかし、それは私にとってはうまくいきません - .include のようですか? 単一の文字 (?) と比較して true を返すことはありません

どんな助けでも大歓迎です!

# PIG LATIN
# If any word within the input string begins with a vowel, add an "ay" to the end of the word

def translate(string)

  vowels_array = %w{a e i o u y}
  consonants_array = ('a'..'z').to_a - vowels_array

  string_array = string.split

  string_array.each do |word|
    if vowels_array.include?(word[0])
      word + 'ay'
    end
  end

  return string_array.join(" ")

end 

translate("apple orange mango")    # => "appleay orangeay mango" but does not
4

4 に答える 4

5

string_array.eachを反復するだけstring_arrayで、変更しません。配列の内容を更新するには、次を使用する必要がありますmap!

  # ...
  string_array.map! do |word|
    if vowels_array.include?(word[0])
      word + 'ay'
    else
      word
    end
  end
  # ...

translate("apple orange mango")    #=> "appleay orangeay mango"

の目的は、条件が満たされない場合else word endでも単語を返すことです。if


配列操作の観点からすると、ほとんどの場合、文字列を操作する最良の方法は正規表現です。

def translate(string)
  string.gsub(/(^|\s)[aeiouy]\S*/i, '\0ay')
end

translate("apple orange mango") #=> "appleay orangeay mango"
于 2013-04-30T07:36:29.170 に答える
1

正規表現の仕事のように聞こえます:

str = 'apple orange mango'

str.gsub(/\b[aeiou]\w*\b/, '\0ay')
#=> "appleay orangeay mango"

gsubパターン (最初の引数) のすべての出現を探し、それを文字列 (2 番目の引数) に置き換えます。その文字列内で、一致したパターンを参照して\0追加ayすることができ\0ayます。

ここで、パターン (実際の正規表現) は、「\bの 1 つで始まり、[aeiou]0 個以上の単語文字 ( \w*) で終わる単語全体をキャプチャする (単語境界に一致する)」ことを意味します。

したがって、完全なメソッドは次のように要約できます。

def translate(string)
  string.gsub /\b[aeiou]\w*\b/, '\0ay'
end 

ほら!

于 2013-04-30T11:45:56.190 に答える
1

試す:

def translate(string)     
  new_string = ''
  string.split.each do |word|
    if 'aoiue'.include?(word[0])
      new_string += word + 'ay '
    else
      new_string += word + ' '
    end
  end
  return new_string.strip
end 

> translate("apple orange mango")
=> "appleay orangeay mango" 
于 2013-04-30T09:04:55.530 に答える
1

ハッシュキーの検索は少し速いかもしれません

v= Hash['a', 1, 'o', '1', 'i', 1, 'u', 1, 'e', 1]
ws= %w(apple orange mango)
ws.map! do |w|
  v[w[0]].nil? ? w : "#{w}ay"
end
p ws
于 2013-04-30T08:19:25.703 に答える