我正在尝试使用案例语句返回值,具体取决于条件。不幸的是,我收到一串语法错误,因为我不完全熟悉应该如何设置 case 语句。
基本上,用户可以属于单个州(地区),因此在用户表中存储用户的"state_id"(例如,53可能是俄勒冈州)。我大部分工作都使用 if 语句,但它太混乱了,所以我被告知"case"将是更好的方法。我还有一个模型"税",belongs_to一个用户和一个用户可以有很多。
在更改为使用案例之前,例如,我正在做if user.state_id == 53
,这是有效的,然后条件if self.income <= 10276
这也有效。然而,现在有了这个案例,虽然稍微重构了一点,但我无法让它工作......(由于计算器<=
和所有其他原因导致的许多语法错误。
def provincial
case user.state_id
when 53
case income
when <= 10276
return 0
when 10277..37568
return self.income * 0.0506
when 37569..75138
return ((self.income - 37568) * 0.077) + 1901
when 75139..86268
return ((self.income - 75138) * 0.105) + 4794
when 86269..104754
return ((self.income - 86268) * 0.1229) + 5963
when > 104754
return ((self.income - 104754) * 0.147) + 8235
end
when 52
case income
when <= 17593
return 0
when > 17593
return self.income * 0.10
end
end
end
您不能将变量放在大小写的开头,然后使用"悬空"不等式(一侧只有一个表达式的不等式)。您将需要具有不等式的变量,或者您可以使用proc
。
所以这个when
条款很好:
when 10277..37568
return self.income * 0.0506
但这个不是:
when > 17593
return self.income * 0.10
但是,您可以将其替换为以下内容:
when proc {|n| n > 17593}
return self.income * 0.10
这通过使用proc
摆脱了"悬而未决"的不平等。你也可以用这个替换它(有点奇怪,但它有效):
Inf = 1.0/0 # Assigns "infinity" to Inf
when 17593..Inf
return self.income * 0.10
您也可以将变量移动到每个when
:
def provincial
case user.state_id
when 53
case
when income <= 10276
return 0
when (income >= 10277) and (income <= 37568)
return self.income * 0.0506
when (income >= 37569) and (income <= 75138)
return ((self.income - 37568) * 0.077) + 1901
...
end
when 52
case
when income <= 17593
return 0
when income > 17593
return self.income * 0.10
end
end
end
end
总的来说,在这种情况下,我认为我最喜欢proc
。 :)
请注意,不能在同一 case 语句中混合大小写开头的变量和when
子句中的变量。所以这是无效的:
case x
when x < 3
# do stuff
when 5
# do stuff
end