【问题标题】:passing block to x.times method将块传递给 x.times 方法
【发布时间】:2015-04-30 18:15:58
【问题描述】:

我正在使用 ruby​​ 的内置函数。我想知道如何动态分配值并将其打印在一个块中。

让我给你看我的例子。

irb(main):001:0> i = 0
=> 0
irb(main):002:0> a = "a"
=> "a"
irb(main):003:0> while i<10
irb(main):004:1> x,a = a, a.next
irb(main):005:1> print x, " "
irb(main):006:1> i+=1
irb(main):007:1> end
a b c d e f g h i j => nil

现在我想用x.times 方法得到相同的结果。 10.times {puts x,a=a, a.next} 引发错误。如何使用x.times 获得相同的结果? 我的 ruby​​ 版本是 1.8.7

编辑:我尝试了更多并得到了这个。但是我们不能像我在while循环中那样使用赋值吗?除了打印“a”和空格外,一切似乎都很好。你能帮我打印出“a”和空格吗?

irb(main):011:0> x="a"
=> "a"
irb(main):012:0> 10.times {print x=x.next}
bcdefghijk=> 10

【问题讨论】:

  • 你知道下个月v1.8.7 将迎来它的七岁生日吗?考虑升级。
  • 我对升级有点保守。但也许是时候升级了。 p.s.我的机器是活的历史 - java 1.2,python 2.5 :)
  • 你认为你的电脑很旧? Here's 我的。 (我升级太便宜了。)
  • 对我来说,60 岁以上的计算机程序员是“过去的闪亮文物”。在我出生之前,他们一直在和电脑打交道,他们很迷人。在这种情况下,“de te fabula narratur”,先生 :)
  • 这很有趣,“人工制品”是我的曾、曾、曾孙子们在提及我时使用的术语。

标签: ruby


【解决方案1】:

我看不到在一行代码中执行您要求的明显方法,但 a='a'; 10.t­imes {x,a = a, a.nex­t; print x,' '} 似乎对我有用:

> a='a'; 10.ti­mes {x,a = a, a.nex­t; print­ x,' '}
=> "a b c d e f g h i j "

在 Ruby 中,您可以使用 ; 作为命令分隔符,但将所有内容写在一行中。

当然,你也可以这么简单地写:

> a='a'; 
  10.ti­mes do
    x,a = a, a.nex­t; 
    print­ x,' '
  end
=> "a b c d e f g h i j "

并获得相同的结果。

【讨论】:

  • FWIW:您可以使用标准库 String::upto 方法:"a".upto("j") {|s| print s, ' ' }
  • 另外,@Matt Brictson 的回答似乎很有用。无论如何,不​​要期望理解您在 Code Golf 上看到的任何答案。
  • @orde 我实际上重新访问该页面以发布该页面也可以使用,现在我看到您已经编写了它。
【解决方案2】:

这似乎是一个人为且复杂的问题,但我认为熟悉函数式 Ruby 更像是一个思考练习。

这里有一些更多的解决方案可以试穿。

太容易了?

("a".."j").each { |c| print c, " " }

或者,由于您有一个起始值(“a”)并将后续值“求和”到该“总数”上,这感觉就像 reduce 的应用程序:

10.times.reduce("a") { |c| print c, " "; c.next }

reduce 块的结果用作下一次迭代的输入。我认为这是您的目标“循环分配”行为。

【讨论】:

  • 是的,我只是在挑战自己的极限。几分钟前我尝试了a="a"; 1.upto(10) {x,a=a, a.next; print x, " "} 并获得了积极的结果:) 自我批评:也许使用这些方法对像我这样的初学者很有吸引力。但我担心,这种有趣的事情也会让某人编写“旧式”代码——就像我们过去用 c 所做的那样。现在,我必须做出一个决定——继续用有限的语法写作还是从这些很棒的东西中受益?
【解决方案3】:

我通过一些替代方案实现了我的目标。我在这里列出它们。我会及时更新。

10.times { x,a= a, a.succ; print x, " "}

1.upto(10) {x,a=a, a.next; print x, " "}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2012-06-10
    • 2012-08-07
    相关资源
    最近更新 更多