0

我有以下方法:

现在有时我希望忽略限制属性

因此 .take 方法将被忽略,目前我不知道如何优雅地做到这一点。设置为 nil 错误代码。

任何帮助表示赞赏 - 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
4

3 回答 3

1

首先,您的代码可以被显着重构以执行与现在相同的操作。无需each构建数组的精确副本,我们可以Kernel#Array按照category您对r.data.category. 最后,any?读起来比 好一点(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

我们可以很容易地把它take拉出一个条件来得到你想要的:

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

(如果需要,当然可以limit重新添加该功能。)

于 2013-08-18T18:51:46.850 回答
0

你可以简单地做

category ||= []
于 2013-08-18T18:27:52.040 回答
0

最后是不是这样

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
于 2013-08-18T18:34:40.627 回答