Ruby 迭代中能否设计成不要双竖线?

wilikeit · 2018年02月25日 · 最后由 wilikeit 回复于 2018年03月03日 · 2399 次阅读

如:

[1,2].each do |i|
    puts i
end

能否不要双竖线

[1,2].each do i
    puts i
end

为什么一定要双竖线,这 2 个竖线真不好输入,为什么不能去掉呢?

那么单行写法怎么处理?

[1, 2].each { |i| puts i }
Rei 回复

确实,要在块中的话,不用竖线隔起来,真不知道循环变量放哪位置合适

你省力的代价就是解释气要费力,你的举手之劳换做解释器可能要用上吃奶的劲,于是就出现了权衡

之前也想过,还企图解决一下,不过代价有点高!

这是以前的代码:

class Array
  def each_as(name, &block)
    define_singleton_method(name) do
      instance_variable_get("@__#{name}")
    end

    define_singleton_method("#{name}=") do |value|
      instance_variable_set("@__#{name}", value)
    end

    each do |elem|
      send("#{name}=", elem)
      instance_exec(&block)
    end
  end
end

a = [1,2,3,4,5]
a.each_as(:x) { puts x }

a.each_as(:int) do
  puts int * 2
end

配置编辑器有自动补全,用 || 问题不大。

下面的 puts i 没有用||包裹,但前面用 () 包裹了,看来还是有不用双竖线的特别情况

c=->(i) do puts i end
c.call("hi")
jasl 回复

本想着 for i in arr 这种写法挺好,但 for 在 ruby 中作用域与 each 不一样,不能用 for 完全代替 each,那就想着 each 要是不要双竖线,就能代替 for 了,没想到不太可能,只有松本行弘本人能做了

我的编辑器打 do 会自动补全|x|和 end,不需要手敲。

真够懒的,人机交流麻

gihnius 回复

回头看好像有戏,只要在 C 层面实现 each_as(:name)

估计要修改源码重新编译才能实现

gihnius 回复

ruby 双竖线中还能有分号,不要双竖线,是不太好整了

[1,2].each do |k;v|
    v=7
    print k,v,"\n"
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号