如果condition为true,则在数组中包含值

时间:2015-01-07 20:59:31

标签: ruby

只有条件为真时,在数组中包含值的惯用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。

5 个答案:

答案 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