2

この質問がばかげている場合は申し訳ありませんが、質問する必要があります。PHP では、最初に配列を宣言しなくても配列を作成できますが、これは良い方法とは見なされません。Ruby に関する新たな知識を活用して、ディレクトリ内のファイルを一覧表示し、拡張子で並べ替えるコードを作成していました。これを行うために、拡張子に基づいて異なる配列に配置するループを開始しました。このような:

files_by_ext = {} #edited - my bad, it was supposed to be {}
files_by_ext['css'] = ['file.css','file2.css','file3.css']
files_by_ext['html'] = ['file.html','file2.html','file3.html']

次に、キー「css」と「html」を使用してソートします。しかし、「X」ファイルの配列を作成する過程で、キー「X」が存在するかどうかを確認する必要がありました。ファイル (例: 'file.X') を単純にプッシュすることはできませんでした。

この動作を変更するメソッドを作成して、アイテムを最初に宣言せずにプッシュする配列を作成する方法はありますか?

files.each do |f|
 extension = /\.(.+)$/.match(f)[1].to_s
 files_by_ext[extension] << f
end

そうではありません(それが私がやっていることです):

files.each do |f|
 extension = /\.(.+)$/.match(f)[1].to_s
 if !files_by_ext.key?(extension)
  files_by_ext[extension] = [f]
 else
  files_by_ext[extension] << f
 end
end

すみません、書きすぎたようです。:P読んでくれてありがとう。

4

3 に答える 3

1

のデフォルト値を設定するには、新しいキーが使用されるたびにブロックをArray.new渡し、新しい配列をハッシュに割り当てる必要があります。Hash.newこれを行う唯一の正しい方法は次のとおりです。

files_by_ext = Hash.new { |hsh, key| hsh[key] = Array.new }

その後、すべてのキーに既に配列が含まれているかのように、そのハッシュ内のキーを使用できます。

files_by_ext['.com'] << 'command.com'

非常に一般的に使用される代替アプローチは、次のことを行うことです。

files_by_ext = Hash.new
# ... later ...
files_by_ext['.com'] ||= Array.new
files_by_ext['.com'] << 'command.com'
于 2010-09-11T02:43:46.800 に答える
0

だから、いくつかのこと:

PHP とは異なり、Ruby では配列 (Arrayクラス ) と連想配列 (Hashクラス ) を区別しています。key->value タイプの構造体が必要です。ファイル拡張子でアクセスするハッシュを使用する必要があります。ハッシュの値は、ファイル名の配列にすることができます。

ただし、これらの値内でファイル名を重複させたくないためSetArray. そうすれば、同じファイル名がすでに挿入されていても心配する必要はありません。

他の人は、 a のデフォルト値の設定についてすでに書いていますHash

于 2010-09-11T05:35:24.213 に答える
0

私はあなたを正しく理解しているとは確信していませんが、エントリの初期値をデフォルトで空の配列にしたいように思えます。たとえば、すべてのエントリがデフォルトで nil ではなく空の配列になるハッシュを作成するのが、クリーンな解決策のように思えます。Ruby では、これを次のように行います。

>> h = Hash.new { |hash, key| hash[key] = Array.new }
{}
>> h[:foo] << "stuff"

これにより、追加する前にエントリが存在するかどうかを確認する必要がなくなります。

于 2010-09-11T02:32:41.847 に答える