不能在方法的默认参数中使用变量

时间:2015-01-14 23:24:16

标签: ruby

我可以在方法的默认参数中使用变量吗?如果没有,那么为什么呢?这是红宝石1.8.7

var = "one"

def sysout(str=var)
  puts str
end

sysout("seven")
sysout()

错误 -

seven
test.rb:3:in `sysout': undefined local variable or method `var' for main:Object (NameError)
        from test.rb:8

2 个答案:

答案 0 :(得分:4)

你可以使用任意任意的Ruby表达式作为可选参数的默认参数值,你可以放在那里绝对没有限制。它可以像单个文字一样简单,也可以像整个应用程序一样复杂。 (虽然我不推荐后者。)

但Ruby的范围规则并没有神奇地消失。局部变量仍然是局部变量,全局变量仍然是全局变量,依此类推。

块是Ruby中唯一创建嵌套作用域的东西,所以你必须使用一个块:

var = 'one'

define_method(:sysout) do |str=var|
  puts str
end

sysout('seven')
# seven

sysout
# one

或者,您可以将默认值设为方法:

def var; 'one' end

def sysout(str=var)
  puts str
end

sysout('seven')
# seven

sysout
# one

或全局变量:

$var = 'one'

def sysout(str=$var)
  puts str
end

sysout('seven')
# seven

sysout
# one

答案 1 :(得分:0)

您可以使用变量,但您定义的局部变量var不会与sysout方法定义的参数位置共享范围。