0

如果我有一个 if 语句

x = 2
y = 1
if x == nil || y == nil || z == nil
  raise "RuntimeError: Argument is nil"
end

有没有可能做类似的事情

raise "RuntimeError: ${Argument} is nil"

参数是哪里的变量nil?或者,我是否必须将条件分开才能起作用?

if x == nil 
  raise "RuntimeError: x is nil"
end

if y == nil 
  raise "RuntimeError: y is nil"
end

if z == nil 
  raise "RuntimeError: z is nil"
end

是否可以找到 if 语句的哪个条件通过,以便执行该块内的代码?在这种情况下,它将是z == nil

4

4 回答 4

2

也许你可以用哈希来做到这一点:

{x: x, y: y, z: z}.each do |k, v|
  raise "RuntimeError: #{k} is nil" unless v
end
于 2013-09-04T22:48:25.733 回答
2

虽然这样的东西“有效”:

%w(x y z).each { |var| raise "#{var} is nil" if eval(var).nil? }

我会写单行:

raise "x is nil" if x.nil?
raise "y is nil" if y.nil?
raise "z is nil" if z.nil?

这更容易理解。

于 2013-09-05T05:11:05.233 回答
0

这也可以:

 w = 1
 x = nil
 y = 4
 z = nil

 a = ['w', 'x', 'y', 'z'].find {|e| !eval(e)}
 raise RuntimeError, ": #{a} is nil" if a

-> RuntimeError: : x 为零

...但我认为您最好使用简单的 if/then 或 case 语句。

于 2013-09-05T04:38:40.317 回答
0

如果你能避免关心是什么nil,你可以写

raise "RuntimeError: an element in this range is nil" if [x, y, z].include? nil
于 2013-09-04T22:54:40.883 回答