私は汎用ペイロードを受け入れ、その後、JSONに変換し、クラスを実装しようとしています:引数として汎用ハッシュ?
require "json"
class Response
alias Payload = Hash(Symbol | String, String | Bool | Int32 | Int64 | Float32 | Float64 | Nil)
@payload : Payload
def initialize(@payload, @method : String = "sendMessage")
end
def to_json
@payload.merge({"method" => @method}).to_json
end
end
Response.new({
"chat_id" => update.message.not_nil!.chat.id,
"text" => "Crystal is awesome but complicated",
})
をしかし、私はinstance variable '@payload' of Response must be Hash(String | Symbol, Bool | Float32 | Float64 | Int32 | Int64 | String | Nil), not Hash(String, Int64 | String)
コンパイラエラーを取得します。どうすればこれを克服できますか?クリスタルは一般ハッシュをサポートしていますか?型が重なっても変換できないのはなぜですか?
Response
は断片の一部ですので、どのハッシュが引数として渡されるのかわかりませんが、Payload
で十分です。
おそらくハッシュを誤って使用していると思います。これは、ハッシュが一般的な "データバッグ"として使われているRubyとは非常に異なっています。 Crystalでは、ここでハッシュを使用する代わりに、カスタムクラスまたはレコードタイプを作成したいと考えています。違いは、ハッシュの場合、キーと値の型との間には関係がないため、この目的のために使用することは非常に難しいことです。クラスを作成する場合、各プロパティは独自の型を持ち、より簡単に使用できます。 CrystalでRubyをプログラミングしようとしないでください。 – RX14
@ RX14参照してください。私はRubyで以前よりも多くのコードを書く必要があります。しかし、それは私に良いパフォーマンスと少ないエラーを与える:) –
はい、それはより多くのコードですが、しばしばあなたのバグが実行時にコンパイラでキャッチされているとして長い時間で短い時間です。数ヶ月後にコードに戻ったら、何が起こっているのかを簡単に伝えることができます。 – RX14