使用嵌套案例语句返回值



我正在尝试使用案例语句返回值,具体取决于条件。不幸的是,我收到一串语法错误,因为我不完全熟悉应该如何设置 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

最新更新