Ruby 使用块查找与条件匹配的值

Ruby 使用块查找与条件匹配的值,ruby,block,Ruby,Block,对我来说,这很有道理: triple = dice.collect {|value| if (dice.count(value) >= 3)} ---> Syntax error 或 我要的是数字的值,而不是dice.count()的真或假。我知道一定有一个简单的方法可以做到这一点。听起来像是你想要的,而不是(也称为) collect/map将获取每个值,并将块的结果放入数组中。这就是为什么你会看到一系列的真/假 select将获取每个值,如果块的计算结果为true,则将其作为数组

对我来说,这很有道理:

triple = dice.collect {|value| if (dice.count(value) >= 3)} ---> Syntax error

我要的是数字的值,而不是dice.count()的真或假。我知道一定有一个简单的方法可以做到这一点。

听起来像是你想要的,而不是(也称为)

collect/map
将获取每个
,并将块的结果放入数组中。这就是为什么你会看到一系列的真/假

select
将获取每个
,如果块的计算结果为
true
,则将其作为数组的一个成员返回:

triple = dice.select{ |value| dice.count(value) >= 3 }
听起来像是你想要的,不是(也被称为)

collect/map
将获取每个
,并将块的结果放入数组中。这就是为什么你会看到一系列的真/假

select
将获取每个
,如果块的计算结果为
true
,则将其作为数组的一个成员返回:

triple = dice.select{ |value| dice.count(value) >= 3 }

您的块需要在最终数组中返回您想要的任何内容

triple = dice.collect {|value| 
  if dice.count(value) >= 3
    dice.count(value)
  end
}

请注意,对于<3的元素,这将返回
nil
(尽管您可以添加
else
以返回0或其他内容)。如果只需要与查询匹配的元素,则需要使用dice.select()

块需要在最终数组中返回所需的内容

triple = dice.collect {|value| 
  if dice.count(value) >= 3
    dice.count(value)
  end
}

请注意,对于<3的元素,这将返回
nil
(尽管您可以添加
else
以返回0或其他内容)。如果只需要与查询匹配的元素,则需要使用
dice.select()

作为第一个代码段

triple = dice.collect {|value| THE_CODE_BLOCK_STARTS_HERE }

因此,
if(dice.count(value)>=3)
是一个不完整的
if
语句。这就是为什么会出现语法错误。

对于第一个代码段

triple = dice.collect {|value| THE_CODE_BLOCK_STARTS_HERE }

因此,
if(dice.count(value)>=3)
是一个不完整的
if
语句。这就是为什么你会出现语法错误。

我想你是想在最后一行写“选择”。哎呀,是的,我是说
select
。我想你是想在最后一行写“选择”。哎呀,是的,我是说
select
。遗憾的是,骰子的成本。count(值)是不确定的,可能很昂贵,在你的块中,它会被调用两次。只需使用“select”而不是“collect”。事实上,select更好,但前提是不需要数组包含
nil
或其他确定值。在他的情况下,他没有,但可能有。悲哀的是,dice.count(value)的成本是不确定的,可能会很昂贵,在您的块中,它会被调用两次。只需使用“select”而不是“collect”。事实上,select更好,但前提是不需要数组包含
nil
或其他确定值。在他的情况下,他没有,但可以。