Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 定义与实例方法同名的OpenStruct属性_Ruby_Openstruct - Fatal编程技术网

Ruby 定义与实例方法同名的OpenStruct属性

Ruby 定义与实例方法同名的OpenStruct属性,ruby,openstruct,Ruby,Openstruct,我在尝试创建一个具有与某个OpenStruct实例方法同名的属性的OpenStruct时遇到了一个问题。具体来说,我想创建一个具有属性capture的开放结构。我在rspec测试中将其用作存根,因此无法更改方法的名称(它必须是capture) 看看OpenStruct方法,它有一个方法capture,调用的就是这个方法。有没有一种方法可以实例化一个具有与其方法之一同名属性的开放结构 为了清楚起见,我特别需要方法捕获,我已经确认了它在rails 4.0.x上的中断,而不是rails 5,但是这种情

我在尝试创建一个具有与某个OpenStruct实例方法同名的属性的OpenStruct时遇到了一个问题。具体来说,我想创建一个具有属性
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