ruby 如何在定义Struct时指定成员的类型?

wj8zmpe1  于 2023-04-29  发布在  Ruby
关注(0)|答案(1)|浏览(117)
Data = Struct.new(:lang_name, :number)
ss = Data.new("Ruby", 3.5)

我希望number是Float类型,如果输入是String类型,尝试使用to_f将其转换为Float

4ioopgfo

4ioopgfo1#

C = Struct.new(:lang_name, :number)
  #=> C

C当然是一个有getter和setter的类:

C.class
  #=> Class

C.instance_methods(false)
  #=> [:number, :lang_name, :lang_name=, :number=]

C也有一个initialize方法:

C.private_instance_methods(false)
  #=> [:initialize]

它继承自Struct

C.superclass
  #=> Struct
Struct.private_instance_methods(false)
  #=> [:initialize, :initialize_copy]

该方法创建示例变量@lang_name@number。因此,我们可以在C中定义一个方法initialize来调用关键字super,并将参数lang_namenumber转换为浮点数。这将使用这些参数执行原始的initialize

class C
  def initialize(lang_name, number)
    super(lang_name, number.to_f)
  end
end
​  #=> :initialize

让我们首先创建一个C的示例,给@number赋值一个float:

c1 = C.new("Ruby", 3.5)
  #=> #<struct C lang_name="Ruby", number=3.5>

我们可以从这个返回值中看到分配给示例变量的值,但要确认:

c1.lang_name
  #=> "Ruby"    
c1.number
  #=> 3.5

现在,让我们通过为@number分配一个字符串来创建C的第二个示例:

c2 = C.new("Ruby", "3.5")
  #<struct C lang_name="Ruby", number=3.5>

我们看到"3.5"已经按照需要转换为浮点3.5。确认:

c2.lang_name
  #=> "Ruby"    
c2.number
  #=> 3.5

请注意,这是一个关键字,我们依赖于方法Float#to_f以及String#to_f。

相关问题