2013-09-04 5 views
0

Если у меня есть, если заявлениеесли заявление: проверить, какое условие квалифицируется

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.

+2

(1) Еще до того, как сообщение об ошибке поднято, ваш код вернет неопределенную ошибку для 'z'. (2) Константа «Аргумент» не может изменить свое значение между «nil» и числами во всем коде. (3) Что вы подразумеваете под «аргументом является переменная, которая равна нулю»? какой аргумент вы упоминаете? – sawa

+0

С помощью 'raise 'RuntimeError: z is nil" 'вы, скорее всего, хотите' поднять RuntimeError, "z is nil" ' – fotanus

+1

@fotanus или просто' raise' z is nil "', по умолчанию используется 'RuntimeError' – Stefan

ответ

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? 

Это гораздо легче понять.

2

Может быть, вы можете сделать это с Hash:

{x: x, y: y, z: z}.each do |k, v| 
    raise "RuntimeError: #{k} is nil" unless v 
end 
+1

-1 Это будет печатать "RuntimeError: $ {k} равно нулю" каждый раз. –

+2

Я предположил, что $ {} была просто опечаткой для '# {}' –

+0

Извините, это была опечатка. – Yanhao

0

Если вы могли бы избежать заботы, которая является nil, вы могли бы написать

raise "RuntimeError: an element in this range is nil" if [x, y, z].include? nil 
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.

Смежные вопросы