私は経験豊富な Obj-C/Java プログラマーで、Ruby を始めています。もちろん、これほど動的であるという事実は素晴らしいことです (クラスを再開できるのは素晴らしいことです!) が、Ruby コードを書き始めたときに、私を悩ませたり心配させたりすることが 1 つあります。
独自のクラスで iVar のタイプを明示的に設定するために、Ruby er が (もしあれば) 何をするかを知りたいです。私が見る限り、iVar を任意のオブジェクトに設定でき、Ruby は文句を言いません。ただし、特定の iVar が特定のタイプであると予想される場合は、後で問題が発生する可能性があります。例えば:
class MyString
def initialize(myString)
@myString = myString
end
def uppercase_my_string
@myString.upcase
end
end
st1 = MyString.new("a string!")
st1.uppercase_my_string
st2 = MyString.new(["a string"])
st2.uppercase_my_string
NoMethodError
もちろん、配列にはメソッドがないため、このコードは をスローしupcase
ます。残念ながら、実際にどこが間違っていたのか (上記の行、作成時str2
) はわかりません。そのため、デバッグ時にはあまり役に立ちません (str2
目立たない場所にいくつかのモジュールが作成された場合)。次のようにいくつかのチェックinitialize
:
class MyString
def initialize(myString)
raise TypeError, "myString iVar is not a string!" unless myString.class == String
@myString = myString
end
end
...same code as before
これで、誤って新しい MyString を作成してしまった場合、自分がいかに愚かであったかを知らされます (さらに重要なのは、失敗したときではなく、いつ作成したかを知らされることです。入力するのは少し面倒ですが、問題ありません。私の次の問題attr_accessors
iVar で使用することを決定したときです。
class MyString
attr_accessor :my_string
def initialize(my_string)
raise TypeError, "myString iVar is not a string!" unless my_string.class == String
@my_string = my_string
end
def uppercase_my_string
@my_string.upcase
end
end
st1 = MyString.new("a string!")
st1.uppercase_my_string
st2 = MyString.new("good, it's a string")
st2.my_string = ["an array!"]
st2.uppercase_my_string
定義されたセッターを使用すると、非常にこっそりとエラー チェックを回避できますinitialize
。uppercase_my_string
繰り返しますが、これには、誤っ@my_string
て配列に設定した場合ではなく、例外をスローするという問題があります。
最後に、アクセサーを手動で作成してエラー チェックを追加することもできますが、これは非常に面倒です...これを行うためのより迅速で簡単な方法はありますか。それとも、私は心を閉ざしていて、十分にダイナミックではありませんか?
ありがとう!
余談ですが、Obj-C でも実行時に同じ問題が発生することはわかっていますが、通常、型のオブジェクトを型array
の変数string
(または類似のもの) に代入しているというコンパイラ エラーが表示されるので、少なくともどこで発生するか警告されます