Строка замены в Рубине и стиль кодирования


Я написал небольшой скрипт на Ruby для создания различных скриншотов, и хотя я не новичок в Руби я редко пользуюсь.

Полный сценарий (41 КУ): https://gist.github.com/1229115

Строка замены раздражать меня. Они выглядят не совсем правильно - слишком уродливые для красивой и лаконичным языком, как Рубин. Я перестарался? Какие альтернативы существуют?

Вот линии меня волнует (для связи, Пожалуйста, обратите внимание на суть):

# assemble file name
fname = "#{directory}/#{prefix}-#{timestamp}-#{commit}-#{size[:width]}x#{size[:height]}.png"

# create command line stuff
call = "#{macruby_exe} #{snapper} \
        --width #{size[:width]} --height #{size[:height]} #{url} #{fname}"

# now call it
system call

# just to show the progress (and the file sizes)
puts "#{fname} (#{File.size?(fname) / 1024}kB)"

Просто чтобы проиллюстрировать сценарий, выход, как правило, выглядит так:

screenies/screenshot-1316535022-0b5c7967887481deb17bcd9039cd3fe0ac4540d4-640x960.png (95kB)
screenies/screenshot-1316535022-0b5c7967887481deb17bcd9039cd3fe0ac4540d4-800x480.png (62kB)
screenies/screenshot-1316535022-0b5c7967887481deb17bcd9039cd3fe0ac4540d4-800x600.png (78kB)
   ^          ^          ^                          ^                       ^
   |          |          |                          |               ________|______
   |          |          |                          |              |               |
directory   prefix     timestamp                  commit    size[:width] x size[:height]


229
8
задан 20 сентября 2011 в 04:09 Источник Поделиться
Комментарии
2 ответа

Есть и другие способы вы могли бы написать это, но я не уверен, если вы найдете любой из них чище. Одним из вариантов является обычная функции sprintf. Например:

# assemble file name
fname = sprintf("%s/%s-%i-%s-%ix%i.png", directory, prefix, timestamp,
commit, size[:width], size[:height])

Вы могли бы сократить его немного, давая размер собственных to_s метод:

class << size; def to_s; "#{self[:width]}x#{self[:height]}" end end

fname = sprintf("%s/%s-%i-%s-%s.png", directory, prefix, timestamp,
commit, size)

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

Другим вариантом было бы сделать свой собственный супер-маленький шаблонизатор, что-то вроде этого:

def tiny_subst template, bndg
param_exp = /:(\w+)[^\w:]+/i
tmpl_params = template.scan(param_exp).flatten

proc {
out_str = template.clone

tmpl_params.reduce(out_str) do |str, p|
str.gsub ":#{p}", eval(p, bndg).to_s unless p.empty?
end
}
end

tmpl = ':directory/:prefix-:timestamp-:commit-:size.png'
subber = tiny_subst(tmpl, binding)

directory = 'screenies'
prefix = 'screenshot'
timestamp = Time.now.to_i
commit = '0b5c7967887481deb17bcd9039cd3fe0ac4540d4'
size = '640x960'

subber.yield # => screenies/screenshot-1316535022-0b5c7967887481deb17bcd9039cd3fe0ac4540d4-640x960.png

commit = 'foobarbazquux'
size = '9000x9000'

subber.yield # => screenies/screenshot-1316535022-foobarbazquux-9000x9000.png

Так, что здорово, но это действительно стоит того? Не для меня, но я думаю, если ты действительно ненавидишь "#{это}" это может быть.

5
ответ дан 22 сентября 2011 в 08:09 Источник Поделиться

На ваш запрос (и рисунок Гист), более лаконичным и читабельным является:

screensizes = [
# width height
[ 640, 960 ], # iPhone 4
[ 800, 480 ], # wvga
[ 800, 600 ], # old school
[ 1024, 600 ], # netbook, WSVGA
[ 1024, 786 ], # old school, iPad
[ 1200, 800 ], # macbook
[ 1366, 786 ], # netbook
[ 1440, 900 ], # macbook pro
[ 1600, 768 ], # strange
[ 1680, 1050 ], # hires macbok
]

screensizes.each do |w,h|
# Assemble file name:
f = "#{directory}/#{prefix}-#{timestamp}-#{commit}-#{w}x#{h}.png"

# Create command line stuff:
s = "#{macruby_exe} #{snapper} --width #{w} --height #{h} #{url} #{f}"

# Now call it:
system s

# Show progress and file sizes:
puts "#{f} (#{File.size?(f) / 1024}kB)"
end

2
ответ дан 21 января 2012 в 11:01 Источник Поделиться