2014-10-30 5 views
0

просто играет с каким-то генератором случайных строк и заставляет мои трусики закручиваться, как передать аргумент методу, который пересматривается каждый раз. Вот где я нахожусь с кодом:Передача блока в качестве аргумента

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

random_string = "".ljust(141, random_letter) 

Конечно проблема здесь в том, что random_letter только получает создается один раз, а затем тот же экземпляр используется 141 раз, я пытаюсь получить random_letter должен быть создан в каждый из 141 случаев, в которых «" заполняется случайным сообщением.

Я уверен, что есть, вероятно, более простые способы в конечном итоге добиться 141 случайной строки символов, и мне было бы интересно увидеть лучшее предложение тоже, howveer, я хотел бы выяснить, как достичь этого, используя тот путь, который я выбрал выше. Thanks

ответ

1

Это невозможно сделать, используя ljust. Все аргументы вычисляются до выполнения основного метода. Независимо от кода, который вы вставляете во вторую позицию аргумента ljust, которая будет оцениваться в определенном объекте, и этот единственный объект будет использоваться в ljust.

Один из способов сделать то, что вы хотите:

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

вариант: '26.times.map {[* "а" .. "г"] [рандов (26)] } .join'. Не видел тебя некоторое время. Где-то на пляже? –

0

Как Савва уже указал, что это не может быть сделано так, как вы пытаетесь сделать это, однако есть и другие способы сделать она с небольшим изменением в коде:

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" 
Смежные вопросы