более рубиновый способ gsub из массива - PullRequest
0 голосов
/ 07 июня 2010

Моя цель - дать x, чтобы x("? world. what ? you say...", ['hello', 'do']) вернул "hello world. what do you say...".

У меня есть кое-что, что работает, но, похоже, далеко от "Рубинового пути":

def x(str, arr, rep='?')
  i = 0
  query.gsub(rep) { i+=1; arr[i-1] }
end

Есть ли более идиоматический способ сделать это?(Позвольте мне отметить, что скорость, конечно, является наиболее важным фактором.)

Ответы [ 4 ]

5 голосов
/ 07 июня 2010

Если вы говорите о рубиновом способе достижения цели функции, я бы просто использовал "%s world" % ['hello'].

Если вы просто спрашиваете о реализации, она выглядит хорошо для меня. Если вы не против уничтожить массив, вы можете немного его сжать, выполнив

query.gsub(rep) { arr.shift }
2 голосов
/ 08 июня 2010

Укороченная версия:

def x(str, *vals) str.gsub('?', '%s') % vals end

puts x("? world what ? you say ?", 'hello', 'do', '12')
puts x("%s world what %s you say %3.2f", 'hello', 'do', '12')
puts x("%s world what %s you say %3.2f", 'hello', 'do', '12')

Выход:

hello world what do you say 12
hello world what do you say 12.00
hello world what do you say 12.00
2 голосов
/ 07 июня 2010

Если это возможно в вашем случае использования, я бы не добавил символ замены в качестве параметра, а затем использовал бы стандартный механизм форматирования строки ruby ​​для форматирования строки. Это дает вам намного лучший контроль над переменными, которые вы хотите заменить внутри строки.

def x(string, values, rep='%s')
  if rep != '%s'
    string.gsub!(rep, '%s')
  end
  string % values
end

a = %w[hello do 12]

puts x("? world what ? you say ?", a, '?')
puts x("%s world what %s you say %3.2f", a)
puts x("%s world what %s you say %3.2f", a, '%s')

И вывод из этого выглядит следующим образом

hello world what do you say 12
hello world what do you say 12.00
hello world what do you say 12.00

Вы должны быть осторожны с этим, так как слишком мало аргументов вызовут исключения, поэтому вы можете захотеть перехватывать исключения и вести себя соответствующим образом. Не зная вашего варианта использования, трудно сказать, подходит ли это или нет.

1 голос
/ 08 июня 2010

ИМО, самый идиоматичный и читаемый способ таков:

def x(str, arr, rep='?')
  arr.inject(str) {|memo, i| memo.sub(rep, i)}
end

Вероятно, он не будет иметь наилучшую возможную производительность (или она может быть очень высокой - скорость Ruby зависит * от конкретной используемой вами реализации), но это очень просто. Насколько это уместно, зависит от вашей цели на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...