1

単語のリストをループして、次のコードを使用して、各単語の先頭にアルファベットの各文字を挿入しています。

def add_charac_front
  ("a".."z").each do |letter|
    @array.each do |list_word|
      list_word.insert(0, letter)
      puts list_word
    end #ends @array loop
  end #ends alphabet loop
end #ends method 

しかし、文字 " "をループスルーすると、先頭が " " ではなく " " になるように変更されて.insertいます。@array@arrayblist_word@arrayHelloaHello

まったく同じ動作が必要ですが、@array実行する文字ループごとに同じ配列にする必要があります。このコードを実行すると、正しく機能します。

def add_charac_front
  ("a".."z").each do |letter|
    @array.each do |list_word|
      puts "#{letter}#{list_word}"
    end #ends @array loop
  end #ends alphabet loop
end #ends method

list_wordしかし、最終的には、前面だけでなく、のさまざまな部分に文字を挿入したいと考えています。

.split("")これを行う別の方法は、list_word、 then .insert(0, letter)、 thenだと思い.joinます。しかし、それはもっと面倒なようです。

どうすればいいですか?

4

4 に答える 4

2

Rubyは、値ではなく参照によって渡されます。これは、list_wordが実際に内部の元の単語の内部を指していることを意味します@array

list_word元のアレイに影響を与えずにそのままプレイしたい場合は、そのコピーを使い捨てで作成する必要があります。例:

def add_charac_front
  ("a".."z").each do |letter|
    @array.each do |orig_word|
      list_word = orig_word.dup # duplicates the list_word
      list_word.insert(0, letter)
      puts list_word
    end #ends @array loop
  end #ends alphabet loop
end #ends method 
于 2012-09-14T05:44:29.327 に答える
1

二重引用符を使用して新しい文字列を簡単に作成し、 #{varname} を使用して新しい文字列を作成することもできます。

irb> @array = %w(foo bar baz)
=> ["foo", "bar", "baz"]
irb> ("a".."e").inject([]) { |m,c| 
                m.concat(@array.map { |item| "#{c}-#{item}" });
                m }
=> ["a-foo", "a-bar", "a-baz", "b-foo", "b-bar", "b-baz", "c-foo", "c-bar", "c-baz", "d-foo", "d-bar", "d-baz", "e-foo", "e-bar", "e-baz"]

map を使用して新しい配列を作成すると、エラーが発生しにくくなり、別の配列をその中に折りたたむ必要がある場合は、inject を使用します。inject の使用に不安がある場合は、map と flatten を使用して同じ結果を得ることができます。

irb> ("a".."e").map { |c| @array.map { |item| "#{c}-#{item}" } }
=> [["a-foo", "a-bar", "a-baz"], ["b-foo", "b-bar", "b-baz"], ["c-foo", "c-bar", "c-baz"],     ["d-foo", "d-bar", "d-baz"], ["e-foo", "e-bar", "e-baz"]]
irb> ("a".."e").map { |c| @array.map { |item| "#{c}-#{item}" } }.flatten
=> ["a-foo", "a-bar", "a-baz", "b-foo", "b-bar", "b-baz", "c-foo", "c-bar", "c-baz", "d-foo", "d-bar", "d-baz", "e-foo", "e-bar", "e-baz"]

Enumerables で連鎖操作を使用すると、実行中の各ポイントでの状態を簡単に調べることができます。そして、それを印刷する必要があるときは、.each { |x| を追加するだけです。x}を置く

これを頻繁に行う場合は、必要な 2 つの配列のデカルト積を簡単に取得できるようにする gem デカルトをインストールしないでください。

irb> require 'cartesian'
=> true
irb> Cartesian::product(("a".."c"), %w(foo bar baz))
=> [["a", "foo"], ["a", "bar"], ["a", "baz"], ["b", "foo"], ["b", "bar"], ["b", "baz"], ["c",   "foo"], ["c", "bar"], ["c", "baz"]]
irb> Cartesian::product(("a".."c"), %w(foo bar baz)).map { |x| "#{x.first}-#{x.last}" }
=> ["a-foo", "a-bar", "a-baz", "b-foo", "b-bar", "b-baz", "c-foo", "c-bar", "c-baz"]
于 2012-09-14T07:45:07.560 に答える
0

要件に準拠しているかどうかはわかりませんが、アレイ自体を操作することをお勧めします

# example.rb

@alpha = %w{a b c d e f g h i j k l m n o p q r s t u v w x y z}

def add_charac_front(array)
  return @alpha + array
end

または、上記のコードは実際には文字を互いの前に挿入しているため、アルファ配列を逆にして前に挿入するのと同じです。

@reverse_alpha = alpha.reverse

def add_charac_front(array)
  return @reverse_alpha + array
end

お役に立てれば。このような範囲を使用して、サブ配列を連結することもできます

a2 = %w{b c}
a3 = @alpha[0..4] + a2 + @alpha[5..13]
于 2012-09-14T05:44:30.353 に答える
0

挿入を使用する必要があると思われる場合は、文字列の新しいコピーを作成できます。

def add_charac_front
  ("a".."z").each do |letter|
     @array.each do |list_word|
       t = String.new(list_word).insert(0,letter)
       puts t
     end #ends @array loop
  end #ends alphabet loop
end #ends method 
于 2012-09-14T05:31:53.850 に答える