Ruby 定义与实例方法同名的OpenStruct属性
我在尝试创建一个具有与某个OpenStruct实例方法同名的属性的OpenStruct时遇到了一个问题。具体来说,我想创建一个具有属性Ruby 定义与实例方法同名的OpenStruct属性,ruby,openstruct,Ruby,Openstruct,我在尝试创建一个具有与某个OpenStruct实例方法同名的属性的OpenStruct时遇到了一个问题。具体来说,我想创建一个具有属性capture的开放结构。我在rspec测试中将其用作存根,因此无法更改方法的名称(它必须是capture) 看看OpenStruct方法,它有一个方法capture,调用的就是这个方法。有没有一种方法可以实例化一个具有与其方法之一同名属性的开放结构 为了清楚起见,我特别需要方法捕获,我已经确认了它在rails 4.0.x上的中断,而不是rails 5,但是这种情
capture
的开放结构。我在rspec测试中将其用作存根,因此无法更改方法的名称(它必须是capture
)
看看OpenStruct方法,它有一个方法capture
,调用的就是这个方法。有没有一种方法可以实例化一个具有与其方法之一同名属性的开放结构
为了清楚起见,我特别需要方法捕获,我已经确认了它在rails 4.0.x上的中断,而不是rails 5,但是这种情况适用于openstruct可能拥有的任何方法
#=> OpenStruct.new(class: true).class
#=> OpenStruct
在
pry
(顺便说一句,运行ruby 2.3)中,这对我来说很好用
下面是另一种方法:
[15] pry(main)> a = OpenStruct.new capture: 1
=> #<OpenStruct capture=1>
[22] pry(main)> a.singleton_class.class_exec { def capture; self[:capture] + 1; end }
=> :capture
[23] pry(main)> a.capture
=> 2
它在rails 5上运行良好,但在rails 4上运行不好。如果您使用方法
class
,它仍然使用openstruct实例方法,而不是我定义的属性“如果您使用方法class
”是什么意思?如果您定义属性class
,而不是capture
,它将使用openstruct实例方法class
,而不是我定义的属性。我为Clarity编辑了我的问题同样的情况。你有没有试过我的建议来换一种方法?不管怎样,我真的不明白为什么这么麻烦是值得的。您可以使用[:class]
访问它,对吗?
[9] pry(main)> OpenStruct.new(capture: 1).capture
=> 1
[15] pry(main)> a = OpenStruct.new capture: 1
=> #<OpenStruct capture=1>
[22] pry(main)> a.singleton_class.class_exec { def capture; self[:capture] + 1; end }
=> :capture
[23] pry(main)> a.capture
=> 2
a = OpenStruct.new capture: 0
allow(a).to receive(:capture).and_return(a[:capture])
a.capture # => 0