【问题标题】:Struct with and without member有和没有成员的结构
【发布时间】:2023-03-25 06:33:01
【问题描述】:

我是一个新的 Rubyist,目前我将在类中使用 Struct 来创建一个临时对象。但是,当我像这样在 Struct 中使用成员时遇到一个问题:

class A
  attr_accessor :b
  B = Struct.new(:name, :print_name) do
    def print_name
      p "Hello #{name}"
    end
  end

  def initialize(input_name)
    @b = B.new(input_name)
  end
end

a = A.new('Leo')
a.b.print_name # Hello Leo

但当我的 Struct B 参数不包含 :print_name 时,我也会收到相同的结果。

B = Struct.new(:name) do
...
end

那么有什么不同呢?什么时候应该使用成员参数,什么时候不使用?

谢谢

【问题讨论】:

    标签: ruby struct


    【解决方案1】:

    在第一种情况下,您定义一个类,它的初始化程序有两个参数 - nameprint_name

    在第二种情况下,您定义一个类,其初始化程序采用单个参数 - name

    这些与您正在定义一个名为 print_name 的实例方法这一事实无关。

    因此两个类的实例(有和没有print_name 参数)都定义了print_name 方法,因此两个示例的工作方式相同。

    当您检查创建的对象时会发现差异:

    # first case with two arguments
    foo = B.new(:a, :b)
    foo.inspect
    => "#<struct B name=:a, print_name=:b>"
    
    # second case with single argument
    foo = B.new(:a)
    foo.inspect
    => "#<struct B name=:a>"
    

    另外,当您检查两种情况下 B 类的实例方法时,您会看到不同之处:

    # first case with two arguments
    B.instance_methods false
    #=> [:name, :name=, :print_name, :print_name=]
    
    # second case with single argument
    B.instance_methods false
    #=> [:name, :name=, :print_name]
    

    但是当我的 Struct B 参数没有时,我也会收到相同的结果 包括:print_name

    不同之处在于,在第一种情况下,您可以执行以下操作:

    a.b.print_name = 'new print name'
    a.b.inspect
    #=> "#<struct B name='Leo', print_name='new print name'>"
    

    而在第二种情况下它会失败:

    a.b.print_name = 'new print name'
    #=> NoMethodError: undefined method 'print_name=' for #<struct B name='Leo'>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2015-01-30
      • 2022-01-18
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多