2015-05-26 3 views
0

Итак, у меня есть строка под названием borrowed_book_bitmask, и я хочу поместить эту строку другой строкой как слева, так и справа. Прокладка определяется в некотором классе как константа. Итак, у меня естьЕсть ли более элегантный способ прокладки строки в Ruby?

borrowed_book_bitmask = Module1::Model1::BITMASK_PADDING + borrowed_book_bitmask + Module1::Model1::BITMASK_PADDING 

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

Предположим, я не могу изменить имя переменной и имя константы.

+1

Здесь я считаю clunky лучше. Для наглядности вы можете написать: «pad = Module1 :: Model1 :: BITMASK_PADDING', затем« pad + loaned_book_bitmask + pad »,« »# {pad} # {заемный_бук_библиотека} # {pad}" 'или' pad.concat (borrowed_book_bitmask) .concat (клише) '. –

ответ

0

Вы можете использовать center method

a = "abc" 
"abc.center(a.size + 4 * 2) 
=> " abc " 
+1

По существу, вы заполняете строку четырьмя пробелами? В моем случае прокладка - это другая строка, не обязательно все пробелы. Скажем, мое заполнение «foo», как бы вы поместили строку с помощью «foo» с помощью центра? Спасибо. –

+0

@ZackXu BTW, 'center' принимает второй параметр, строку для ввода. 'заемный_book_bitmask.center (заимствованный_book_bitmask.length + 2 * Module1 :: Model1 :: BITMASK_PADDING.length, Module1 :: Model1 :: BITMASK_PADDING)' будет работать. – mudasobwa

0
borrowed_book_bitmask.gsub! /\A|\z/, Module1::Model1::BITMASK_PADDING 
+0

Ницца. Я никогда не думал об использовании 'gsub' на якоре. –

+0

Как насчет: loaned_book_bitmask.gsub!/^ | $ /, Module1 :: Model1 :: BITMASK_PADDING –

+0

@ZackXu Если вы хотите, чтобы он сбой по строкам, содержащий '\ n', не стесняйтесь идти с'/^ | $/'. – mudasobwa

1

Что вы имеете в виду под "подушки"? Всегда добавлять одни и те же строки с каждой стороны?

"#{Module1::Model1::BITMASK_PADDING}#{borrowed_book_bitmask}#{Module1::Model1::BITMASK_PADDING"} 

Что вы подразумеваете под "элегантным"? Интерполяция выглядит более элегантно, чем конкатенация (и более сильный IIRC, чего я не могу). Если borrowed_book_bitmask - это метод, вы можете встроить его в метод или использовать декоратор для инкапсуляции функциональности.

+0

Под «pad» я подразумеваю конкатенацию на обоих концах. Под «изящным» я имею в виду короче и понятнее. Мне кажется, что в этом случае конкатенация стилистически чиста (вы используете # {}, когда мне нужно использовать +). Возможно, мой синтаксис не может быть улучшен дальше, но просто интересно, есть ли лучший способ там. Спасибо. –

+0

@ZackXu Просто интерполировать или объединить. Это примерно так же ясно, как и получается. Я мог бы поместить константу в более короткую локальную переменную для удобочитаемости, но, скорее всего, я переместил бы функциональность в хорошо названный метод и оставил бы ее без изменений до конца своей жизни. ИМО вы слишком задумываетесь о тривиальной реализации. –

+0

«Элегантный» должен, вероятно, всегда включать DRY-принцип. Я сомневаюсь, что решение с очень длинным именем переменной, повторяющимся дважды в одной строке, может считаться элегантным. – mudasobwa

1

Мне кажется, что inelegance происходит от повторения параметра модуля; Мне нужно визуально разобрать два длинных термина, чтобы проверить, что они одинаковые.

pad = Module1::Model1::BITMASK_PADDING 
borrowed_book_bitmask = pad + borrowed_book_bitmask + pad 

... слишком очевидно? Может быть, это только более элегантно для меня.

Смежные вопросы