2016-11-25 5 views
0

私は単一の方法で簡単なプログラムを作ったが、それをテストしようとしているが、奇妙なエラーが発生し、なぜそれが起こっているのか分かりません。 は、ここで私が書いた唯一の方法のための私のコードです:私は "未定義のメソッド 'new'のために...(毎回変わる数)"

def make_database(lines) 
     i = 0 
     foods = hash.new() 
     while i < lines.length do 
     lines[i] = lines[i].chomp() 
     words = lines[i].split(',') 
     if(words[1].casecmp("b") == 0) 
      foods[words[0]] = words[3] 
     end 
     end 
    return foods 
    end 

そして、ここで(同じプログラム内)メソッドを呼び出すために私が持っているものです。

if __FILE__ == $PROGRAM_NAME 
    lines = [] 
    $stdin.each { |line| lines << line} 
    foods = make_database(lines).new 
    puts foods 
    end 

私は痛いほど混乱しています。特に、「未定義のメソッドnew(乱数)」ごとに異なる乱数が与えられています。

答えて

2

これは簡単な間違いです。

foods = Hash.new() 

以上簡潔に:

foods = { } 
hashHashは、おそらく意図しているハッシュクラスであるインデックスエントリのハッシュ構造で使用される番号を返し、現在のオブジェクトのメソッドを呼び出し、

Hash.new(0) 
:の場合のように

それは、あなたがデフォルトのようなものを指定する必要がない限り、Hash.newの代わりに{ }を使用するために理想的です

すべての値はデフォルトで0に初期化されます。これは、単純なカウンタを作成するときに便利です。

Rubyクラスは、このような混乱を避けるために大文字で始まります。構文に慣れれば、そのような間違いを見つけやすくなります。

Rubyコードを書くときは、ほとんどの場合空の引数リストで中括弧/括弧を省略します。つまり、x()は、単にxと表現されています。これは代わりに、代わりにあなたがそれを手動で構成する場所あなたがそこに持っているもののreadlinesにすべての行を読み込むことができることなどが注意すべきx().y().z()

他のもののx.y.zのように、連鎖する場合は特に、より読みやすいコードを保持します。試してみてください:

make_database($stdin.readlines.map(&:chomp)) 

はあなたのコードのより積極的なリファクタリングは、次のようになります従うことが少し難しいかもしれません

def make_database(lines) 
    # Define a Hash based on key/value pairs in an Array... 
    Hash[ 
    # ...where these pairs are based on the input lines... 
    lines.map do |line| 
     # ...which have comma-separated components. 
     line.split(',') 
    end.reject do |key, flag, _, value| 
     # Pick out only those that have the right flag. 
     flag.downcase == 'b' 
    end.map do |key, flag, _, value| 
     # Convert to a simple key/value pair array 
     [ key, value ] 
    end 
    ] 
end 

ができますが、そうでない場合は、単純な一連のを一緒に連鎖するのこつを得ればあなたのRubyコードはより柔軟で、はるかに読みやすくなります。

+0

ブロックをラムダにバストしておくと、それに従うのが簡単になるかもしれません。その場合、 'lines.map(&into_pieces).reject(&those_i_dont_want).each_with_object({}、add_to_hash)'などのことができます。 –

+0

[私のラインを断片にカット!](https://youtu.be/j0lSpNtjPM8)[申し訳ありませんが、抵抗できなかった: - D] –

関連する問題