0

如果我有以下 Ruby 代码:

def result(b=25)
  puts b
end

然后我可以简单地调用result,然后输出 25 。到目前为止,没有问题。

但我想从另一种方法调用它,如下所示:

def outer(a,b)
  #...do some stuff with a...
  result(b)
end

我想outer(1,5)输出 5,但outer(1)只是输出 25。实际上,我想将“未定义”传递给该result方法。

有什么办法可以做到这一点吗?(遗憾的是,我不能简单地使用def outer(a,b=25),因为默认值b实际上result是一个方法类的实例变量。)

4

3 回答 3

2

那这个呢:

def outer(a,b = nil)
  ...do some stuff with a...
  result(*[b].compact)
end

如果 b 不为 nil,则调用 result(b);如果 b 为 nil,则调用 result()

于 2013-01-25T19:09:02.187 回答
0

解决此问题的一个选项是将 b 放在 getter 方法后面:

def get_b
  @b
end

def outer(a, b = get_b)
  #...do some stuff with a...
  result(b)
end
于 2013-01-25T19:03:05.720 回答
0

我提出的解决方案只是稍微改变了你最初的问题,但它已经接近了。你可以用inner方法默认outer的第二个值,然后再次调用inner方法。如果你实际输出一些东西,它的工作有点奇怪,但如果你不调用 puts,它工作得很好。

def result(b=25)
  b
end

def outer(a, b = result)
  #...do stuff with a...
  puts result(b)
end

仅当您不提供默认值时,这会将默认值分配给 b。如果您确实提供了它,它将在结果中使用该 b 。从功能上讲,它似乎按照您想要的方式工作,唯一需要注意的是,如果您的内部方法正在做一些不平凡的事情,那么您将在默认情况下重复工作。

于 2013-01-25T20:24:24.617 回答