Я пишу библиотеку для гуманизации байтов в Ruby (например, чтобы превратить счетчик байтов 1025 в строку 1.1K), и я застрял на одном элементе дизайна.
План состоит в том, чтобы расширить Numeric
методом humanize
, который возвращает дружественную человеку строку при вызове по номеру. Посмотрев на источник Number :: Bytes :: Human (модуль Perl, который мне очень нравится за это), я решил добавить к этому методу две опции: одну для использования 1000-байтовых блоков и одну использовать floor
вместо ceil
для функции округления по умолчанию.
Чтобы обеспечить максимальную гибкость, определение метода использует хеш для параметров, чтобы пользователи могли изменить один или оба параметра. Если параметры не передаются, используется хэш по умолчанию. Это дает мне что-то вроде этого:
def humanize(params = {})
params = {:block => 1024, :r_func => lambda }.merge params
# yada yada
end
В идеале, я бы хотел, чтобы пользователь передавал функцию в качестве значения params[:r_func]
, но я не могу понять, как проверить, что это либо ceil
, либо floor
. Поскольку я не могу справиться с этим, я закончил тем, что сделал следующее, что кажется довольно неуклюжим:
def humanize(params = {})
params = {:block => 1024, :r_func => 'ceil' }.merge params
if params[:r_func].eql? 'ceil'
params[:r_func] = lambda { |x| x.ceil }
elsif params[:r_func].eql? 'floor'
params[:r_func] = lambda { |x| x.floor }
else
raise BadRound, "Rounding method must be 'ceil' or 'floor'."
end
# blah blah blah
end
Если кто-нибудь знает хитрость, чтобы заглянуть в метод, содержащийся в Ruby-лямбде, я бы с удовольствием его услышал. (Я также рад услышать любой другой совет по дизайну.) Спасибо.