Использование print вместо sprintf с% s и% и несколькими аргументами подстановки строк - PullRequest
1 голос
/ 12 февраля 2009

В следующем рубиновом коде вывод будет: "x y"

x = "x %s"
y = "y"
z = "z"
print x % y %z

% z игнорируется.

Я хочу, чтобы вывод был "x y z".

Чтобы понять возможности и ограничения синтаксиса Ruby, я хочу использовать только команду печати и флаги% s и% . Я знаю, как сделать это с помощью sprintf, но я хочу знать, есть ли способ сделать это с помощью команды «print».

Итак, я попытался добавить второй% s к определению переменной 'x':

x = "x %s %s"
y = "y"
z = "z"
print x % y %z

Но я получил эту ошибку:

in `%': too few arguments (ArgumentError)

С помощью sprintf вы можете сделать это:

x = "x %s %s"
y = "y"
z = "z"
print (sprintf(x, y, z))

Вывод будет таким, как я хотел:

x y z

Но это слишком просто.

Есть ли способ сделать это, просто 'print' (не sprintf) и без использования # {} или объединения y и z в массив как [y, z]?

Ответы [ 4 ]

3 голосов
/ 12 февраля 2009

Я на самом деле не понимаю, что вы хотите сделать, но:

irb(main):001:0> x = "x %s"
=> "x %s"
irb(main):002:0> y = "y %s"
=> "y %s"
irb(main):003:0> z = "z"
=> "z"
irb(main):004:0> print x % y % z
x y z=> nil

и:

irb(main):006:0> x = "x %s %s"
=> "x %s %s"
irb(main):007:0> y = "y"
=> "y"
irb(main):008:0> z = "z"
=> "z"
irb(main):009:0> x % [y,z]
=> "x y z"
2 голосов
/ 12 февраля 2009

Использование print "x #{y} #{z}".

Я не смог найти много документации легко с Google ... однако вот несколько страниц, где демонстрируется это использование:

http://www.rubycentral.com/pickaxe/tut_expressions.html

http://linuxgazette.net/issue81/ramankutty.html

http://metacpan.org/pod/Inline::Ruby

1 голос
/ 12 февраля 2009

Похоже, консенсус заключается в том, что нельзя избежать использования синтаксиса подстановки # {}. И нотация%, кажется, работает, только если вы используете массив [y, z] для объединения двух переменных в одну единицу.

То, что я действительно хотел, хотя был какой-то способ сделать это:

печать x% y, z

без объединения переменных y и z в одну.

Возможно, это невозможно, и вы также должны:

  1. Использовать замену # {}
  2. Объедините y и z в массив и затем вызовите print x% [y, z]
  3. Используйте sprintf следующим образом: print (sprintf (x, y, z))

и определить х как:

x = "x% s% s"

0 голосов
/ 12 февраля 2009

Может быть, это то, что вы хотите?:

irb(main):001:0> x = "x %s %s"
=> "x %s %s"
irb(main):002:0> y = "y"
=> "y"
irb(main):003:0> z = "z"
=> "z"
irb(main):004:0> print x % [y,z]
x y z=> nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...