当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Struct.new用法及代码示例


本文简要介绍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-lang.org大神的英文原创作品 Struct.new。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。