【发布时间】:2018-01-26 23:35:58
【问题描述】:
假设我有以下课程 Message 代表聊天中的消息。
class Message
JSON.mapping({
message_id: {type: Int32},
text: {type: String, nilable: true},
photo: {type: Photo, nilable: true},
sticker: {type: Sticker, nilable: true},
})
MESSAGE_TYPES = %w( text photo sticker )
{% for type in MESSAGE_TYPES %}
def {{ type.id }}?
! {{ type.id }}.nil?
end
{% end %}
end
每条消息都可以是文字、照片或贴纸。但只有其中之一。例如,如果 message 是文本,则 photo 和 sticker 属性为 nil,但 text 不是 nil。如果 message 是贴纸,则只有 sticker 不是 nil。等等。真实类有更多的直接类型和推断类型。
收到此消息后,我想以特定类型的特定方式对其进行处理。比如:
case message
when .text?
p message.text
when .photo?
p message.photo.file_id
when .sticker?
p message.sticker.file_id
end
当然不行,因为在每个when 子句中对应的属性都是nilable 和undefined method 'file_id' for Nil。
有没有办法在每种情况下限制变量类型,确保 message.sticker? 然后 message.sticker 不是 nil 并且 file_id 存在?
也许我在非常接近问题方面完全错了,还有更好、更简洁的编码方式吗?
【问题讨论】:
标签: crystal-lang