95644


以下のコードは、ABC310-B(<https://atcoder.jp/contests/abc310/tasks/abc310_b>)を解こうとして書いたコードです。

[code]

    class Product
        attr_accessor :price, :fncs
        def initialize(price, fncs)
            @price, @fnc=price, fncs
        end
    end
    n,m=gets.chomp.split(" ").map(&:to_i)
    ps=[]
    n.times do |i|
        t=gets.chomp.split(" ").map(&:to_i)
        pr=t.delete_at(0)
        t.delete_at(0)
        ps.push(Product.new(pr,t))
    end
    #p ps
    (1..n).to_a.permutation(2).to_a.each do |perm|
    #    p perm
        i=perm[0]-1
        j=perm[1]-1
    #puts "#{i} #{j}"
    "puts "#{ps[i]} #{ps[j]}"
        if ps[i].price<ps[j].price
            next
        end
        flag=true
        ps[i].fncs.each do |f|
            if !ps[j].fncs.include?(f)
                flag=false
                break
            end
        end
        if flag==false
            next
        end
        if ps[i].price>ps[j].price
            puts "Yes"
            exit
        end
        ps[j].fncs.each.do |f|
            if !ps[i].fncs.include?(f)
            puts "Yes"
            exit
        end
    end
    puts "No"
    
[/code]

価格price(整数)と機能fncs(配列)をメンバに持つクラスの配列psを作り、その中で、

  1. ps[i].price>=ps[j].price
  2. ps[i].fncsの全ての要素はps[j].fncsにも含まれる
  3. 「ps[i].price>ps[j].price」または「ps[j].fncsにはps[i].fncsに含まれない要素がある」

の全てが成り立つ(1⋀2⋀3)かどうかを調べようとしています。

ここで、26行目の

[code]

    ps[i].fncs.each do |f|
    
[/code]

のところで、

[code]

    Main.rb:26:in `block in <main>': undefined method `each' for nil:NilClass (NoMethodError)
    
        ps[i].fncs.each do |f|
    
[/code]

というエラーが出て止まってしまいます。  
n個の配列の生成とn個から2個選んで並べる配列の生成まではできているのに、なぜ`ps[i].fncs`が`nil`になるのか分かりません。


CC BY-SA 4.0
2023-07-16T01:47:39.613
95643
2023-07-16T02:10:20.710
2023-07-16T02:02:08.257
19110
54984
question
ruby
Rubyで、なぜかnilになる


クラス `Product` のイニシャライザーで `@fncs` を `@fnc` に typo しています。

[code]

    class Product
        attr_accessor :price, :fncs
        def initialize(price, fncs)
            @price, @fnc=price, fncs
            #       ^^^^
        end
    end
    
[/code]

`ps[i].fncs` が `nil` になっているというエラーなので、疑うべきは `fncs` に値を書き込んでいるところです。このプログラムで
`fncs` に代入している箇所としてまず `Product.new`
しているあたりを調べて、そこは大丈夫そうだったので次にイニシャライザーを見に行ったら打ち間違いに気付きました。


CC BY-SA 4.0
2023-07-16T02:10:20.710
95644
2023-07-16T02:10:20.710
19110
95643
answer