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

标签 ruby struct

我是一名 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/

相关文章:

python - 相当于 Python 在 Ruby 中的计数器

ruby-on-rails - 在 Active Admin (Rails 3.2/postgreSQL/active admin 1.0) 上过滤多选

c - 从结构体指针添加 int

c - 将结构指针传递给c中的函数

ruby - 'Array#each' 中的 If 语句仅在最后一个元素上返回 'true'

ruby - 在 ruby​​ String#scan 方法中向正则表达式添加括号会破坏它

ruby - 如何使用此 mixin 来更改 DateTime 对象?

c++ - 使用 std::array 与数组传递对象数组

c - 具有动态矩阵的动态结构

C++:首先声明哪个结构?