本文简要介绍ruby语言中 Struct.new
的用法。
用法
new(*member_names, keyword_init: false){|Struct_subclass| ... } → Struct_subclass
new(class_name, *member_names, keyword_init: false){|Struct_subclass| ... } → Struct_subclass
new(*member_names) → Struct_subclass_instance
new(**member_names) → Struct_subclass_instance
Struct.new
返回 Struct
的新子类。新的子类:
-
可能是匿名的,或者可能具有
class_name
给出的名称。 -
可能有
member_names
给出的成员。 -
可能通过普通参数(默认)或关键字参数(如果给出
keyword_init: true
)进行初始化。
新的子类有自己的方法 ::new
;因此:
Foo = Struct.new('Foo', :foo, :bar) # => Struct::Foo
f = Foo.new(0, 1) # => #<struct Struct::Foo foo=0, bar=1>
类名称
使用字符串参数 class_name
,返回一个名为 Struct
的新子类 Struct::class_name
:
Foo = Struct.new('Foo', :foo, :bar) # => Struct::Foo
Foo.name # => "Struct::Foo"
Foo.superclass # => Struct
如果没有字符串参数 class_name
,则返回 Struct
的新匿名子类:
Struct.new(:foo, :bar).name # => nil
堵塞
在给定块的情况下,创建的子类将屈服于该块:
Customer = Struct.new('Customer', :name, :address) do |new_class|
p "The new subclass is #{new_class}"
def greeting
"Hello #{name} at #{address}"
end
end # => Struct::Customer
dave = Customer.new('Dave', '123 Main')
dave # => #<struct Struct::Customer name="Dave", address="123 Main">
dave.greeting # => "Hello Dave at 123 Main"
输出,来自 Struct.new
:
"The new subclass is Struct::Customer"
会员姓名
符号参数 member_names
确定新子类的成员:
Struct.new(:foo, :bar).members # => [:foo, :bar]
Struct.new('Foo', :foo, :bar).members # => [:foo, :bar]
新的子类具有对应于 member_names
的实例方法:
Foo = Struct.new('Foo', :foo, :bar)
Foo.instance_methods(false) # => [:foo, :bar, :foo=, :bar=]
f = Foo.new # => #<struct Struct::Foo foo=nil, bar=nil>
f.foo # => nil
f.foo = 0 # => 0
f.bar # => nil
f.bar = 1 # => 1
f # => #<struct Struct::Foo foo=0, bar=1>
单例方法
Struct.new
返回的子类具有以下单例方法:
-
方法
::new
创建子类的一个实例:Foo.new # => #<struct Struct::Foo foo=nil, bar=nil> Foo.new(0) # => #<struct Struct::Foo foo=0, bar=nil> Foo.new(0, 1) # => #<struct Struct::Foo foo=0, bar=1> Foo.new(0, 1, 2) # Raises ArgumentError: struct size differs
方法
::[]
是方法::new
的别名。 -
方法
:inspect
返回子类的字符串表示:Foo.inspect # => "Struct::Foo"
-
方法
::members
返回成员名称的数组:Foo.members # => [:foo, :bar]
关键字参数
默认情况下,初始化新子类实例的参数是普通参数(不是关键字参数)。使用可选的关键字参数 keyword_init: true
,新的子类使用关键字参数进行初始化:
# Without keyword_init: true.
Foo = Struct.new('Foo', :foo, :bar)
Foo # => Struct::Foo
Foo.new(0, 1) # => #<struct Struct::Foo foo=0, bar=1>
# With keyword_init: true.
Bar = Struct.new(:foo, :bar, keyword_init: true)
Bar # => # => Bar(keyword_init: true)
Bar.new(bar: 1, foo: 0) # => #<struct Bar foo=0, bar=1>
相关用法
- Ruby Struct.each用法及代码示例
- Ruby Struct.length用法及代码示例
- Ruby Struct.filter用法及代码示例
- Ruby Struct.deconstruct_keys用法及代码示例
- Ruby Struct.select用法及代码示例
- Ruby Struct.struct[name]用法及代码示例
- Ruby Struct.self ==用法及代码示例
- Ruby Struct.inspect用法及代码示例
- Ruby Struct.dig用法及代码示例
- Ruby Struct.to_a用法及代码示例
- Ruby Struct.to_h用法及代码示例
- Ruby Struct.to_s用法及代码示例
- Ruby Struct.size用法及代码示例
- Ruby Struct.members用法及代码示例
- Ruby Struct.values用法及代码示例
- Ruby Struct.deconstruct用法及代码示例
- Ruby Struct.hash用法及代码示例
- Ruby Struct.each_pair用法及代码示例
- Ruby Struct.values_at用法及代码示例
- Ruby Struct.struct[name] =用法及代码示例
- Ruby Struct each()用法及代码示例
- Ruby Struct filter()用法及代码示例
- Ruby Struct inspect()用法及代码示例
- Ruby Struct size()用法及代码示例
- Ruby Struct eql?()用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Struct.new。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。