0

我有一些红宝石,我正在传递一个 Web 控件(下拉列表)。我的意图是计算被选中的列表项的数量,如果该计数大于 1,则取消选择下拉列表中的第一项。

这是我到目前为止所拥有的......它不会中断,但计数总是显示为 0,即使我强制选择更多项目也是如此。

return control if control.nil?;

count = 0;
control.Items.each { |item| if item.Selected == "true" then count+=1 end }
if count > 1 then
  control.Items[0].Selected = "false"
end
return control;

我也尝试过 item.Selected = 1 ,认为它被视为有点。有人可以指出我搞砸了什么。

谢谢

4

2 回答 2

2

仍在使用您的“字符串布尔值”:

unless control.nil?
  if control.Items.select { |item| item.Selected == "true" }.count > 1 then
    control.Items[0].Selected = "false"
  end
end

return control;

使用真正的布尔值:

unless control.nil?
  control.Items[0].Selected = false if (control.Items.select { |item| item.Selected }.count > 1)
end

return control;
于 2013-08-15T21:42:42.280 回答
0

对 mbranch 片段的一个小重构:

if control 
  control.Items[0].Selected = false if control.Items.count(&:Selected) > 1
end
control

我使用if control,因为如果unless control.nil?是,我不认为应该有一个名为.truecontrolfalseFalseClassItems

count接受一个块作为参数,它将增加数组中每个项目的计数器,以使块返回true。通过这样做,您可以避免对Items.

&:Selected只是一个“技巧”(&调用to_proc符号并Symbol#to_proc返回它引用的方法),它与做{ |i| i.Selected }

无论如何,方法应该写在不大写的snake_case中,然后在不推荐使用if之后等等(https://github.com/bbatsov/ruby-style-guide)。

于 2013-08-16T01:12:23.503 回答