1
Char::ReaderStruct
として標準ライブラリで定義されています。 Class
の代わりにStruct
を選択する理由は何でしたか?CrystalのChar :: Readerは、クラスではなくStructとして定義されていますか?
Char::ReaderStruct
として標準ライブラリで定義されています。 Class
の代わりにStruct
を選択する理由は何でしたか?CrystalのChar :: Readerは、クラスではなくStructとして定義されていますか?
私はそれは、パフォーマンス上の理由で選びだしたと思います。 docsによると:
構造体は、主に小さなコピーを渡すと、より効率的であるかもしれないとき、小さなメモリ割り当ての多くを回避するために、パフォーマンス上の理由から使用されています。
それでは、どのように構造体とクラスの間で選ぶのですか?経験則では、インスタンス変数が再割り当てされない場合、つまりタイプが不変の場合、構造体を使用できます。そうでない場合はクラスを使用します。
Char::Reader
(インスタンス変数が再割り当てされたため)変更可能ですが、コンパイラの内部がreader
が構造体であっても、何を行うのに十分安全であると思わ:
reader = Char::Reader.new(pattern)
while reader.has_next?
char = reader.current_char
reader = check_char reader, char
reader.next_char
end
感謝。また、stdlib JSONレクサー(文字列用)はインスタンスvar(つまり、@reader = Char :: Reader.new(str))としてそれを参照として変更します: '@ reader.next_char'。出典:https://github.com/crystal-lang/crystal/blob/master/src/json/lexer/string_based.cr –