Ruby Limit/Take/First-有时限制或忽略

Ruby Limit/Take/First-有时限制或忽略,ruby,middleman,Ruby,Middleman,我有以下方法: 现在,有时我希望忽略limit属性 因此.take方法将被忽略,目前我不知道如何优雅地执行此操作。将代码设置为“零”时出错 感谢任何帮助-ruby新手 def articlesByCategory( category, extensions = [ "md" ], limit = 3 ) # Check category is an array if !category.kind_of?(Array) category = [ category

我有以下方法:

现在,有时我希望忽略limit属性

因此.take方法将被忽略,目前我不知道如何优雅地执行此操作。将代码设置为“零”时出错

感谢任何帮助-ruby新手

def articlesByCategory( category, extensions = [ "md" ], limit = 3 )

    # Check category is an array
    if !category.kind_of?(Array)
        category = [ category ]
    end

    # Create Return Array
    ret = []

    # Get the resources that are
    sitemap.resources.select { |r| ( category & Array( r.data.category ) ).present? }.take( limit ).each do |a|

        ret << a

    end

    # Return
    ret

end
你可以这么做

category ||= []

最后是这样吗

def articlesByCategory( category, extensions = [ "md" ], limit = 3 )

    # Check category is an array
    if !category.kind_of?(Array)
        category = [ category ]
    end

    # Create Return Array
    ret = []

    # Get Resources
    resources = sitemap.resources.select { |r| ( category & Array( r.data.category ) ).present? }

    # Check limit is set
    if !limit.nil?
        resources = resources.take( limit )
    end

    # Get the resources that are
    resources.each do |a|

        ret << a

    end

    # Return
    ret

end

首先,您的代码可以进行显著的重构,以完成与现在相同的任务。不需要执行each来构建数组的精确副本,我们可以像对r.data.category那样将KernelArray应用于category。最后,有吗?IMO比present?读得好一点,特别是因为值不能为nil,只有当nil或false是有效类别时才需要注意

def articles_by_category category, limit = 3
  category = Array(category)
  sitemap.resources.select do |resource|
    (Array(resource.data.category) & category).any?
  end.take(limit)
end
def articles_by_category category
  category = Array(category)
  sitemap.resources.select do |resource|
    (Array(resource.data.category) & category).any?
  end
end

articles_by_category('My Category').take(3)
我们可以很容易地将外卖放入一个条件中,以获得您想要的:

def articles_by_category category, limit = 3
  category = Array(category)
  articles = sitemap.resources.select do |resource|
    (Array(resource.data.category) & category).any?
  end
  limit ? articles.take(limit) : articles
end
然而,完全在方法内部摆脱限制并在外部施加限制可能是有意义的。这是一个功能性更强的方法,可以防止你的方法做很多事情。限制与按类别获取文章有什么关系?这个方法甚至不按类别获取文章,它获取给定类别的所有资源(可能是文章)

def articles_by_category category, limit = 3
  category = Array(category)
  sitemap.resources.select do |resource|
    (Array(resource.data.category) & category).any?
  end.take(limit)
end
def articles_by_category category
  category = Array(category)
  sitemap.resources.select do |resource|
    (Array(resource.data.category) & category).any?
  end
end

articles_by_category('My Category').take(3)
请注意,如果category永远不会是一个数组,并且可能给出了它的单数名称,那么您可以进一步将方法简化为:

def articles_by_category category
  sitemap.resources.select do |resource|
    resource.data.category == category
  end
end

当然,如果需要的话,还可以添加限制功能。

如果我们有示例输入/输出,这将非常有用。这个方法可能需要一些严重的重构。Input-articlesByCategory facebook,[md],nil,out-put是一个来自MiddleMant的帖子数组,这还不够有用。什么是sitemap.resources?它的数据类别是什么?为什么不使用扩展时会传入扩展?类别将永远是一个数组吗?资源的data.category是否会是数组?