如何在定义Ruby Struct时指定成员类型并实现自动转换?
给Struct的number成员实现自动Float转换
要让number成员始终保持Float类型,且传入String时自动调用to_f转换,可以通过在Struct定义中重写属性的赋值方法来实现,这样不管是初始化还是后续修改属性都会生效:
Data = Struct.new(:lang_name, :number) do # 重写number的赋值方法,自动转换为Float def number=(value) super(value.to_f) end end # 测试不同输入场景 # 初始化传入Float ss1 = Data.new("Ruby", 3.5) puts ss1.number.class # 输出 Float puts ss1.number # 输出 3.5 # 初始化传入String ss2 = Data.new("Python", "2.7") puts ss2.number.class # 输出 Float puts ss2.number # 输出 2.7 # 后续修改属性时传入String ss3 = Data.new("Java", 8) ss3.number = "11" puts ss3.number.class # 输出 Float puts ss3.number # 输出 11.0
如果只需要在初始化时做转换(后续赋值不强制转换),可以重写initialize方法:
Data = Struct.new(:lang_name, :number) do def initialize(lang_name, number) super(lang_name, number.to_f) end end # 测试初始化转换 ss = Data.new("Ruby", "3.5") puts ss.number.class # 输出 Float # 但后续直接赋值String不会转换 ss.number = "2.6" puts ss.number.class # 输出 String
通常推荐第一种重写赋值方法的方案,能确保number属性在任何时候都是Float类型。
内容的提问来源于stack exchange,提问作者Cegazhos
相关产品推荐
相关产品推荐

