У меня есть хэш, как это:массива в строку с конкретным форматом
@password_constraints = {
length: 'Must be at least 6 character long.',
contain: [
'one number',
'one lowercase letter',
'one uppercase letter.'
]
}
И я хочу написать метод, который возвращает строку удобочитаемой, построенную из этого хэша, как этот:
Длина должна быть не менее 6 символов. Должно содержать: одно число, одну строчную букву и заглавную букву.
В настоящее время, у меня есть очень подробный метод с each
, что перебирает в @password_constraints[:contain]
массива и имеет несколько условий, чтобы проверить, если я должен поставить ,
, или and
или ничего.
Но я хочу почти то же поведение, что и join(', ')
, но последний разделитель должен быть and
.
Я ищу какое-то решение, как этот с особой join
:
def password_constraints
@password_constraints[:length] << ' Must contain.' << @password_constraints[:contain].join(', ')
end
Есть ли способ, чтобы сделать это более компактный или Ruby, как?
Это, безусловно, больше похоже на Ruby. Для ясности предпочтительнее использовать оператор splat для вытягивания последнего элемента и использование интерполяции строк вместо конкатенации. Если вы действительно хотите напугать, вы можете изменить второй бит интерполированного кода в выходной строке на '' # {(другие << second_last) * ','} "', но это намного сложнее прочитать. –
Такое элегантное решение и очень компактное. Это определенно то, что я искал. Спасибо огромное! – soutoner
Я обновляю решение: вторая строка метода должна быть удалена, и она должна быть в конце третьего, чтобы не изменять текущий хеш. '* others, second_last, last = constraints [: содержать]' '' # {constraints [: length]} Должен содержать: # {(другие << second_last) .join (',')} "<<" и # {last} ", если last.nil?' – soutoner