如何将Ruby方法转换为块?

Mar*_*tin 17 ruby styles pointfree

有没有办法简化以下代码?

filenames是文件名(字符串)的列表,例如["foo.txt","bar.c","baz.yaml"]

filenames.map { |f| File.size(f) }
Run Code Online (Sandbox Code Playgroud)

有没有办法将"File.size"变成proc或block?对于现有对象的方法,我可以做到&:method.模块级方法有类似的东西吗?

tok*_*and 26

您可以使用Object#method(method_name):

filenames.map(&File.method(:size))
Run Code Online (Sandbox Code Playgroud)


Log*_*man 5

filesize = proc { |f| File.size(f) }
filenames.map(&filesize)
Run Code Online (Sandbox Code Playgroud)

  • 这并没有简化它,反而增加了额外的复杂性。 (4认同)
  • @MartinC.Martin 事实上,它并没有简化它。但这正是你所问的。这个答案非常简单地将表达式变成了一个过程。怪你自己。这是你的错,不是洛根的。 (2认同)