ruby - 其他 Ruby Map 速记符号

标签 ruby map shorthand

我知道 map 的简写形式如下:

[1, 2, 3, 4].map(&:to_s)
> ["1", "2", "3", "4"]

有人告诉我这是以下的简写:

[1, 2, 3, 4].map{|i| i.to_s}

这很有道理。我的问题是:看来应该有更简单的写法:

[1, 2, 3, 4].map{|x| f.call(x)} 

对于某些程序 f。我知道我刚刚输入的方式一开始并没有那么长,但我认为前面的例子也没有速记法。这个例子看起来像是对第一个例子的补充:我不想为每个 i 调用 i 的 to_s 方法,我希望为每个 x 调用 f。

有这样的简写吗?

最佳答案

不幸的是,这种速记符号(称为“Symbol#to_proc”)无法将参数传递给被调用的方法或 block ,因此您甚至无法执行以下操作:

array_of_strings.map(&:include, 'l') #=> this would fail

但是,您很幸运,因为您实际上并不需要此快捷方式 来完成您想做的事情。 & 符号可以将 Proc 或 Lambda 转换为 block ,反之亦然:

my_routine = Proc.new { |str| str.upcase }
%w{ one two three }.map &my_routine #=> ['ONE', 'TWO', 'THREE']

请注意 my_routine 之前缺少冒号。这是因为我们不想通过查找方法并调用 .method:my_routine 符号转换为 proc,而是希望将 >my_routine Proc 进入一个 block 并将其传递给 map

了解这一点,您甚至可以映射原生 Ruby 方法:

%w{ one two three }.map &method(:p)

method 方法将采用 p 方法并将其转换为 Proc,而 & 将其转换为一个 block ,该 block 将被传递到 map 。结果,每个项目都被打印出来。这相当于:

%w{ one two three }.map { |s| p s }

关于ruby - 其他 Ruby Map 速记符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793616/

相关文章:

javascript - 这个简写更聪明

flash - 有人知道 Shorthand Action Script 3 吗?

ruby-on-rails - 使用 ActiveRecords 和 Rails 获取大量记录的最快方法(find_each 很慢)

ruby-on-rails - 使数组无效后不会释放 Ruby 内存

pointers - 在映射中的结构上调用指针方法

c++ - 令人困惑的 std::map 插入行为

ruby-on-rails - 每当 Gem 和 cron 作业

ruby - 从 Ruby 中的排序数组创建嵌套哈希——递归 group_by

R mapproj lambert-azimuthal 等面积投影

php - 在三元简写中使用 php header 重定向?