1. ホーム
  2. ruby

[解決済み] 配列に何かを追加しようとしたときに、nil から整数への暗黙の変換が行われない。

2022-02-14 13:55:09

質問

かなり複雑なハッシュを構築しようとしているのですが、不思議なことにエラーが発生します。

no implicit conversion from nil to integer

という行を使用すると

manufacturer_cols << {:field => 'test'}

同じ行を後で同じループの中で使っていますが、問題なく動作しています。

コード全体は

manufacturer_cols=[]
manufacturer_fields.each_with_index do |mapped_field, index|


        if mapped_field.base_field_name=='exactSKU'

            #this is where it is breaking, if I comment this out, all is good
            manufacturer_cols << { :base_field=> 'test'}


    else


        #it works fine here!
        manufacturer_cols << { :base_field=>mapped_field.base_field_name }
    end
end

------- manufacturer_fields の値 -------。

[{"base_field":{"base_field_name":"Category","id":1,"name":"Category"}},{"base_field".Base_field:{"base_field_Name":"Category"}}: {"base_field_name":"Description","id":3,"name":"Short_Description"}},{"base_field":{"base_field_name";}: "exactSKU","id":5,"name":"Item_SKU"}},{"base_field":{"base_field_name":"Markup","id": 25,"name":"Retail_Price"}},{"base_field":{"base_field_name":"Family","id":26,"name":"Theme" }}] があります。

解決方法

暗黙の変換エラーの説明

あなたのコードがなぜこのエラーになるのか、正確にはわかりませんが、このエラーの意味を正確にお伝えすることができます。

Rubyには2種類の変換があります。 明示的 暗黙のうちに

明示的な変換は、次のように短い名前を使用します。 #to_s または #to_i. これらはコアで共通に定義されており、常に呼び出されています。これらは文字列でも整数でもないオブジェクトのためのものですが、デバッグやデータベース変換、文字列補間などのために変換されることがあります。

暗黙的な変換は、長い名前を使用し、例えば #to_str または #to_int. この種の変換は、文字列や整数に非常によく似たオブジェクトのためのもので、単にその分身の形をとるときを知る必要があるだけです。これらの変換はコアでは決して,あるいはほとんど定義されません。 (Hal Fultonの ルビー・ウェイ を識別します。 パス名 を定義する理由を見つけるクラスの1つです。 #to_str .)

あなたのエラーを出すのはかなり難しいです、さらに NilClass は、明示的な(短い名前の)コンバータを定義しています。

nil.to_i
=> 0

">>#{nil}<<" # this demonstrates nil.to_s
=> ">><<"

このように発動させることができます。

Array.new nil
TypeError: no implicit conversion from nil to integer

そのため あなたのエラーは、Rubyインタプリタ内のCコードから発生しています。 Cで実装されたコアクラスが、Rubyのインタープリタに nil を期待しているのに Integer . を持つことがあります。 #to_i を持つが #to_int というように、結果的に TypeErrorです。