Ruby Limit/Take/First-有时限制或忽略
我有以下方法: 现在,有时我希望忽略limit属性 因此.take方法将被忽略,目前我不知道如何优雅地执行此操作。将代码设置为“零”时出错 感谢任何帮助-ruby新手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
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是否会是数组?