Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 如何确定进程调用仍然是空闲的还是绑定的?_Ruby - Fatal编程技术网

Ruby 如何确定进程调用仍然是空闲的还是绑定的?

Ruby 如何确定进程调用仍然是空闲的还是绑定的?,ruby,Ruby,我想看看是否具有相同参数的proc调用每次都会给出相同的结果pureproc使用参数调用是免费的,因此每次调用pureproc(1,1),都会得到相同的结果dirtyproc在其环境中是绑定的,因此即使它与pureproc具有相同的算术,其输出也将取决于环境 ruby-1.9.2-p136 :001 > envx = 1 => 1 ruby-1.9.2-p136 :003 > pureproc = Proc.new{ |a,b| a+b } => # ruby-1.9.2-p136 :00

我想看看是否具有相同参数的proc调用每次都会给出相同的结果
pureproc
使用参数调用是免费的,因此每次调用
pureproc(1,1)
,都会得到相同的结果<使用参数调用的code>dirtyproc在其环境中是绑定的,因此即使它与
pureproc
具有相同的算术,其输出也将取决于环境

ruby-1.9.2-p136 :001 > envx = 1 => 1 ruby-1.9.2-p136 :003 > pureproc = Proc.new{ |a,b| a+b } => # ruby-1.9.2-p136 :004 > dirtyproc = Proc.new{ |a,b| a+b+envx } ruby-1.9.2-p136:001>envx=1 => 1 ruby-1.9.2-p136:003>pureproc=Proc.new{a,b{a+b} => # ruby-1.9.2-p136:004>dirtyproc=Proc.new{| a,b | a+b+envx}
如何以编程方式确定被调用的proc或方法是自由的,正如仅通过绑定必须传入的变量定义的那样?对绑定、局部变量等的任何解释都是受欢迎的。

Hm,很棘手。有一个
parameters
方法可以告诉您预期的参数(注意它们是可选的,因为您使用的是procs,而不是lambdas)

至于确定是否有一个封闭变量实际用于计算proc的返回值,我想到了使用AST(这方面有很多优点),但似乎很麻烦。我的第一个想法是类似于
dirtyproc.instance\u eval{local\u variables}
,但由于两个闭包都在同一个环境中关闭,这显然不能让您走得很远


但总的问题是:如果你想确保某样东西是纯的,为什么不把它作为一种合适的方法,一开始就不关闭环境呢。有一个
parameters
方法可以告诉您预期的参数(注意它们是可选的,因为您使用的是procs,而不是lambdas)

至于确定是否有一个封闭变量实际用于计算proc的返回值,我想到了使用AST(这方面有很多优点),但似乎很麻烦。我的第一个想法是类似于
dirtyproc.instance\u eval{local\u variables}
,但由于两个闭包都在同一个环境中关闭,这显然不能让您走得很远


但总的问题是:如果你想确保某个东西是纯的,为什么不让它成为一个合适的方法,而不是一开始就关闭环境呢?

也许你可以使用一些gem-like-sourcify解析源代码,取出所有标记,然后检查是否有任何变量。但请注意,这与proc/method调用的值为常量是不同的概念。例如,如果您的代码中有
Time.now
Random.new
之类的内容,则不需要定义任何变量,但每次调用时仍会发生变化。另外,当proc具有
envx-envx
时,您希望是什么情况?这将保持不变,但仍然会影响代码,因为它将返回错误,除非定义了
envx

可能您可以使用一些gem-like-sourcify解析源代码,取出所有标记,并检查是否有任何变量。但请注意,这与proc/method调用的值为常量是不同的概念。例如,如果您的代码中有
Time.now
Random.new
之类的内容,则不需要定义任何变量,但每次调用时仍会发生变化。另外,当proc具有
envx-envx
时,您希望是什么情况?这将保持不变,但仍然会影响代码,因为它将返回错误,除非定义了
envx

谢谢Michael,如果我定义函数,“def”技巧可能会有所帮助,但更多的情况是库(或测试)代码询问可能来源未知的现有进程。我想AST可能是一种最后的手段。谢谢Michael,如果我定义函数,“def”技巧可能会有所帮助,但更多的情况是库(或测试)代码询问可能来源未知的现有进程。我想AST可能是最后的手段。我觉得这相当于解决停车问题,但是我无法证明。LOL-我不是在寻找停止问题的解决方案-只是关于Ruby“知道”进程的一些信息,就它们所指的变量范围而言。我感觉这相当于解决停止问题,但是我无法证明。LOL-我不是在寻找一个解决停顿问题的方法-只是关于Ruby“知道”进程的一些信息,就它们所引用的变量的范围而言。这一点和其他问题让我相信,在Ruby中“知道”函数的幂等性即使不是不可能,也是相当棘手的。我仍然在寻找一个答案,关于它是否在任何非局部定义的变量上都是封闭的,然而这一点和其他问题让我相信,在Ruby中“知道”函数的幂等性即使不是不可能,也是相当棘手的。我仍然在寻找一个答案,关于它是否在没有局部定义的变量上是封闭的
pureproc.parameters
=> [[:opt, :a], [:opt, :b]] 
dirtyproc.parameters
=> [[:opt, :a], [:opt, :b]]