【发布时间】:2010-12-05 19:53:12
【问题描述】:
我正在编写一个库来人性化 Ruby 中的字节(例如,将字节数 1025 转换为字符串 1.1K),但我被困在设计的一个元素上。
计划是使用humanize 方法扩展Numeric,该方法在对数字调用时返回对人类友好的字符串。在查看了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 lambda 包含的方法的技巧,我很想听听。 (我也很高兴听到任何其他设计建议。)谢谢。
【问题讨论】:
标签: ruby parameters methods