【发布时间】:2017-01-05 08:19:14
【问题描述】:
目前我正在 Ruby 中开发一个Watcher 类,除其他外,它能够找到切换信号的周期持续时间。这通常相当简单,但我面临的一个问题是显然 Ruby 按值传递所有参数。
在网上研究时,我发现许多关于“按值传递”和“按引用传递”实际上是什么的不同讨论,但没有实际的“如何”。来自 C/C++ 背景,对我来说,这是编程/脚本语言的重要组成部分。
我编写的类的相关部分如下所示。 Watcher::watchToggling() 方法是我遇到问题的方法。作为参数,aVariable 应该是我正在测量周期持续时间的值的参考。
class Watcher
@done
@timePeriod
def reset()
@done = false;
@timePeriod = nil;
end
def watchToggling(aVariable, aTimeout=nil)
oldState = aVariable;
oldTime = 0;
newTime = 0;
timeout(aTimeout)do
while(!@done)
newState = aVariable;
if(newState != oldState)
if(newState == 1)
# rising edge
if(oldTime != 0)
# there was already a rising edge before,
# so we can calculate the period
newTime = Time.now();
@timePeriod = newTime - oldTime;
@done = true;
else
# if there was no previous rising edge,
# set the time of this one
oldTime = Time.now();
end
end
oldState = newState;
end
end
end
puts("Watcher: done.")
end
def isDone()
return @done;
end
def getTimePeriod()
return @timePeriod;
end
end
ruby 有什么方法可以通过引用传递吗?如果没有,是否有替代方案可以解决这个问题?
【问题讨论】:
-
你的信号是如何实现的,特别是切换?
-
@Ven 在我现在工作的测试应用程序中。但我正在使用一个庞大且相当古老的框架。考虑到我可能无法在参数是否为对象之间进行选择,是否有另一种方法?
-
在 Ruby 中一切都是对象
-
@Stefan 信号被映射到变量中。例如,我正在检查蜂鸣器是否以特定频率切换。是否蜂鸣的状态存储在全局变量中。但是我还需要测量其他值的频率,这就是为什么我要避免直接从全局变量中读取。
-
@Ven 那么在那种情况下,我真的没有选择使用对象,不是吗?既然没有其他选择...
标签: ruby parameter-passing pass-by-reference pass-by-value pass-by-pointer