動的なCSVファイルを読み込み、CSVのヘッダーに基づいて構造体を作成するクラスがあります。
これは疑似コードのようになります:
class SomeClass
def initialize(csvfile)
@csv = CSV.open(csvfile, options.....)
.....
headers = @csv.headers # => [:line, :error, :user, ........] <==this is dynamic
RECORD = Struct.new(headers)
load_data
end
def load_data
@records = []
@csv.each do |r|
@records << RECORD.new(r.fields)
end
end
end
問題は、定数を動的に定義することはできません(すべきではありません)。では、これに対処する適切な方法は何でしょうか?
回答:
回答№1は2定数を使用する必要はありません。インスタンス変数を使用してください。
class SomeClass
def initialize(csvfile)
@csv = CSV.open(csvfile, options...)
...
headers = @csv.headers
@record = Struct.new(headers)
load_data
end
def load_data
@records = []
@csv.each do |r|
@records << @record.new(r.fields)
end
end
end
回答№2の場合は0
@ sawa "s 答えは正しい。私はここで何かを追加します。
定数 変更しない値を格納するために使用されます。プログラムの定数を変更した場合は、おそらく バグ。 Rubyは役に立ちたいと思っています。 "ホールドしてください!私はここで不思議なことが起こっていると思います。あなたはこれを定数にしたいと言っていましたが、今は変更されています!
Rubyでは、上記の理由からメソッド定義の中に定数を代入することは決してできません。あなたがしようとすると 固定割り当て 方法の中で、あなたは 構文エラー。あなたの必要性に応じて、メソッドの中で任意の変数を使用できますが、定数変数は使用できません。
もし、するなら
Y = 1
#then
Y = 2
# warning: already initialized constant Y
# warning: previous definition of Y was here
しかし、あなたが試してみると、
def meth arg
C = arg
end
# then
# SyntaxError: dynamic constant assignment
# C = arg
# ^