gpt4 book ai didi

ruby - 有成员和无成员的结构

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:38 25 4
gpt4 key购买 nike

我是一名 Ruby 新手,目前我将在类里面使用 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

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

谢谢

最佳答案

在第一种情况下,您定义了一个类,它的初始化程序接受两个参数 - 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]

But I also receive the same result when my Struct B params don't include :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'>

关于ruby - 有成员和无成员的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40068936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com