在像`end.compact`之类的`end`之后的方法会发生什么?

时间:2014-06-08 02:19:25

标签: ruby

在此代码中,

working_days = open(ARGV[0].to_s,'r').each_line.map do |line|    
  do_something
end.compact

map函数返回数组[1, nil, 3, nil]。我将compact添加到关键字end。我想知道幕后的情况。添加compact后,返回数组变为:

  • [1][1,3]
  • [1][1, nil][1, nil, 3][1, nil, 3, nil][1, 3]

如何使用pry检查每一步?

compact块与do end块一起发送到地图功能吗?

2 个答案:

答案 0 :(得分:2)

这里没有魔力。您的代码与以下内容相同:

tmp = open(...).each_line.map do |line|
  do_something
end

working_days = tmp.compact

您只需删除中间步骤,将map的返回值指定给临时变量。

这样做的区别......

a(b(c()))

并且这样做:

tmp = c()
tmp = b(tmp)
tmp = a(tmp)

您只是直接在返回值上调用函数,而不是使用第二个语句。

答案 1 :(得分:1)

我不明白为什么你会以复杂的方式思考它。它完成如下:

[1, nil, 3, nil] → [1, 3]

您无法观察到中间步骤。