只有条件为真时,在数组中包含值的惯用Ruby方法是什么?
class ItemPolicy
def initialize(user)
@user = user
@allowed = user.manager?
end
# Suggest improvements to the permitted_attributes method
def permitted_attributes
[:name, :details] + (@allowed ? [:price] : [])
end
end
这感觉不太Ruby-ish。
答案 0 :(得分:1)
没有任何问题,但我觉得这种方法可能会随着时间的推移而增长并且会让人感到更加困惑。我不确定为什么@allowed
不在方法之外,但忽略了我可能会这样做:
def permitted_attributes
permitted = [:name, :details]
permitted += :price if @allowed
permitted
end
通过这种方式,您可以随着时间的推移增加它并添加其他逻辑,同时保持其可读性。
答案 1 :(得分:1)
嗯,你可以这样做......
@allowed = false
def permitted_attributes
[
:name,
:details,
*(:price if @allowed),
]
end
老实说,我认为这有点令人困惑。真正最好的方法可能是保持简单:
def permitted_attributes
attrs = [:name, :details]
attrs << :price if @allowed
attrs
end
答案 2 :(得分:0)
像这样:
def permitted_attributes
Array[
:name,
:details,
*@allowed ? :price : nil
]
end
或如果您愿意,可以在一行:
def permitted_attributes
[:name, :details, *@allowed ? :price : nil]
end
答案 3 :(得分:0)
class Array
def add_object_if(object_to_add)
if yield
self << object_to_add
else
self
end
end
end
arr = [1,2]
bool = true
arr.add_object_if(3) { bool }
p arr #=> [1, 2, 3]
bool = false
arr.add_object_if(4) { bool }
p arr #=> [1, 2, 3]
答案 4 :(得分:0)
我唯一能想到的就是将条件包装成一个自己的小方法,这可以提供更明确的原因。
还以为我会添加attr_reader
来删除实例变量的重用。
class ItemPolicy
attr_reader :allowed
def initialize(user)
@user = user
@allowed = user.manager?
end
# Suggest improvements to the permitted_attributes method
def permitted_attributes
[:name, :details] + conditional_attributes
end
def conditional_attributes
return [] unless allowed
[:price]
end
end