【问题标题】:Why is attr_accessor making my methods private?为什么 attr_accessor 将我的方法设为私有?
【发布时间】:2014-02-24 01:32:38
【问题描述】:

我想在一个类上动态定义 attr_accessor,但它使生成的方法成为私有的。如果不使用正常的类语法或自己编写方法,如何使以下内容不引发错误?

klass = Class.new
klass.send(:attr_accessor, 'name')
instance = klass.new
instance.name

NoMethodError: private method `name' called for #<#<Class:0x007fce725ec660>:0x007fce72607b18>

【问题讨论】:

  • 你使用的是 ruby​​ 2.0 吗?
  • 刚刚试了你的截图,它适用于 MRI 2.1.0。您使用的是哪个版本的 Ruby?
  • 我在 1.9.3 版本中尝试过,也可以正常工作。但是后来尝试了 ruby​​ 2.0,我得到了和你一样的错误。
  • @IsmaelAbreu 我正在使用 ruby​​ 2.0.0。如果我真的需要,我可以升级它。
  • @KarlGlaser 在创建class 时没有将块传递给Class.new 的任何原因,这似乎更像是文档中所做的

标签: ruby metaprogramming private attr-accessor


【解决方案1】:

正如documentation 的示例中所述,Class.new 被传递了一个块,所以我将执行以下操作:

klass = Class.new do
  attr_accessor :name
end

instance = klass.new
instance.name = "Foo"
instance.name #=> "Foo"

【讨论】:

    猜你喜欢
    • 2018-06-06
    • 2019-07-14
    • 2018-01-23
    • 2022-11-18
    • 2011-03-07
    • 1970-01-01
    • 2013-03-16
    • 2015-04-16
    • 2014-04-06
    相关资源
    最近更新 更多