如何在Ruby中将一个方法调用链接到一个“do ... end”块?

7

我正在进行以下操作:

array_variable = collection.map do |param|
  some value with param
end
return array_variable.compact

我可以以某种方式在一个语句中调用 mapcompact 吗,这样我就可以立即返回结果了吗?

我考虑的是类似这样的语句(可能无效):

array_variable = block_code param.compact 
# block_code here is a method for example which fills the array

你的问题不够清晰。你只能在对象上调用方法,但块不是对象,所以你不能在它们上调用方法。你可以将块实例化为 Proc 对象,然后你就可以在其上调用方法;但 Proc 没有 compact 方法。(“压缩块”甚至是什么意思?) - Jörg W Mittag
我目前对Ruby并不是很清楚。我想压缩数组对象,但我是在do块内填充它。我并没有说我认为这样做是好的,我只是想澄清我想要一次性填充和压缩数组,就像函数组合一样。 - MattSom
那么,您是在问是否可以在方法的返回值上调用另一个方法? - Jörg W Mittag
1
现在我更加困惑了。您接受了一个回答,该回答向您展示如何调用另一个方法(在本例中为compact)的返回值上的方法(在本例中为map),但这不是您要问的问题?那么,你到底想问什么,为什么会接受一个回答来回答你不提出的问题? - Jörg W Mittag
1
我立刻理解了这个问题,并且觉得它非常有用。 - WestCoastProjects
显示剩余2条评论
1个回答

16

是的,你可以在此处调用一个方法。

在你的情况中,

array_variable = collection.map do |param|
  # some value with param
end.compact

或者

array_variable = collection.map{ |param| some value with param }.compact

正如@Stefan所指出的那样,不需要进行赋值操作,您可以直接使用return,如果这是该方法中的最后一行,则也可以省略return


1
在您的情况下,您正在调用map的返回值(即Array)上的compact,而问题要求“在块上调用方法”。现在,我不知道“在块上调用方法”甚至意味着什么,但您肯定是在一个Array上调用compact - Jörg W Mittag
1
当然可以,这非常取决于返回类型,因为map返回一个数组并且compact属于它,所以可以使用,但并非总是如此。这就是为什么我提到“是的,在这里可以调用一个方法”。 - Md. Farhan Memon
@JörgWMittag 我认为你有点在无谓的争吵,Md.FarhanMemon立即意识到了我的意图,你肯定也是。我的问题标题是错误的,我承认。 但是,是的,我想要压缩块的结果,因为它明显将返回值映射到数组中。 - MattSom
2
请注意,OP想要返回结果,因此对array_variable的赋值是多余的。只需return collection.map { ... }.compact(如果这是方法的最后一条语句,甚至可以省略return)。 - Stefan
我个人对 end.compact 语法感到烦恼,因为字母有点连在一起,所以很容易在快速扫描时错过。我的观点是,用花括号分隔的多行块没有任何问题。 - Kelvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接