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

このようなものが「機能」している間:

%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 に答える
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 に答える
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 is nil

...しかし、単純な 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 に答える