2015-05-16 2 views
0

Код ниже длиннее рекомендуемых 80 символов.Строка конкатенации интерполированных переменных

Я попытался разбить его и связать его с оператором + и оператором <<, но он не работает. Я пробовал метод .to_s и переместил двоеточия в свою строку, но безрезультатно.

Что было бы правильным способом разделить это на 2 или 3 строки без получения ошибки no method "[email protected]":String?

string = "#{sprintf("%02i", hours)}:#{sprintf("%02i", minutes)}:#{sprintf("%02i", seconds)}" 
+0

Если у вас есть объект 'Time' вместо ваших' hour', 'minute',' second' integers, вы можете использовать ['time.strftime (% H:% M:% S)'] (http : //ruby-doc.org/core-2.2.0/Time.html#method-i-strftime). –

+0

Пожалуйста, отредактируйте, чтобы показать желаемый результат. –

+0

Я пробовал это, но я не думаю, что время является частью рубина, поэтому он дал мне ошибку, говоря, что время не определено. – Jeff

ответ

5

Вы можете объединить три sprintf в один:

string = sprintf("%02i:%02i:%02i", hours, minutes, seconds) 
+0

НЕ ответ на вопрос –

+1

@AndreyDeineko Если вопрос является общим * как разбить строку, которая включает в себя строки, интерполированные переменные, на несколько строк * , Ты прав. Однако в этой конкретной проблеме это не так, потому что ** код OP использует ненужную интерполяцию строк. –

+0

Хорошо, спасибо за это, я мог бы узнать из этого, потому что я забыл, что sprintf был по существу таким же, как printf в java – Jeff

1

Чтобы разбить строку на многострочный в Ruby, вы используете обратную косую черту:

string = "#{sprintf("%02i", hours)}: \ 
#{sprintf("%02i", minutes)}: \ 
#{sprintf("%02i", seconds)}" 

Обратите внимание, как есть только один открытие и закрытие один ".

Вы также можете рассмотреть возможность переноса трех вызовов на метод sprintf в один.

+0

почему минус? это ответ на вопрос ОП. кто сделал это? :) –

+0

Что именно происходит с пространством между этим двоеточием и обратным слэшем? Все пустое пространство просто удалено из-за \? – Jeff

+0

@Jeff, если вы положили обратную косую черту без пробела после ':', не будет места –

0

Я предполагаю, что ваш вопрос заключается в том, что, учитывая количество секунд или временный объект, вы хотите построить строку с нужным форматом ,

Если вы получаете seconds:

def fmt(seconds) 
    hours, minutes = seconds.divmod(60) 
    "%02d, %02d, %02d" % [hours, *minutes.divmod(60)] 
end 

fmt(223) 
    #=> "03, 00, 43" 

Если вы получаете Time объект:

require 'time' 

def fmt(time) 
    time.strftime('%H hours, %M minutes, %S seconds') 
end 

time = Time.now 
    #=> 2015-05-16 14:38:02 -0700 
fmt(time) 
    #=> "14 hours, 38 minutes, 02 seconds" 

В этом втором случае я добавил слова "часы", "минуты" и «секунды «просто чтобы проиллюстрировать, как можно изменить строку формата.

Если вы хотите напечатать это на нескольких строках, просто вставьте строки новой строки (\n) в соответствующую строку формата.

+0

Просто быстрый вопрос. Я не понимаю, почему вы делаете часы, минуты = секунды.divmod (6). Шесть там не имеют математического смысла для меня. – Jeff

+0

Спасибо, что заметили, что Джефф. Это должно быть «60». –