传递一个块作为参数

时间:2014-10-30 07:24:27

标签: ruby parameters arguments block proc

只是玩一些随机的字符串生成并让我的短裤在如何将参数传递给每次重新评估的方法上。我在这里使用代码:

random_letter = ('a'..'z').to_a[rand(26)]

random_string = "".ljust(141, random_letter)

当然这里的问题是random_letter只创建一次,然后相同的实例被使用了141次,我试图在141次"&#中的每一次生成random_letter。 34;用random_letter填充。

我确信最终可能有更简单的方法来获得141个随机字符串,我也有兴趣看到更好的建议,但我想知道如何使用该路径实现此目的我选择上面。感谢

2 个答案:

答案 0 :(得分:1)

使用ljust无法做到这一点。在执行main方法之前评估所有参数。无论您在ljust的第二个参数位置插入什么代码,都会将其评估为某个对象,并且该单个对象将在ljust中使用。

做你想做的事的一种方法是:

26.times.with_object(""){|_, s| s << [*"a".."z"][rand(26)]}
#=> "zjqmdumyrmmfnwsdjysvtolxjn"

答案 1 :(得分:0)

由于sawa已经指出它无法按照您尝试的方式完成,但是还有其他方法可以通过稍微修改代码来实现:

random_letter = proc { [*'a'..'z'].sample }
random_string = 141.times.with_object(''){ |_, s| s << ''.ljust(1, random_letter.call) }
p random_string
# => "cnvmixiolqsgtdbdjrjsmaulslyphvcmvxnheulnrsxdqqryqgrplenyyneagufglkxqsyowbcfdgejwafrubqfnkvnehdtkhygmtpizbgzkyboyqhlrxqdzhglnsigtaglviaesphois"

random_string = 141.times.with_object(''){ |_, s| s << ''.ljust(1, [*'a'..'z'].sample) }
p random_string
# => "wcgkqliwyggfyvxfblyalqgpdbrqvlikxuqwyecihvdkytsbsikhwldvsjamkiicytfcgvvmoeuleeftzizrscujejkuanrxbqwzcywtboidrftinayfvqdygqwrfjhxvyiazzxinjudm"