![]() |
1
27
关于Ruby世界的一个有趣的事实是Rubinius项目的存在,它主要用纯Ruby实现Ruby及其标准库。因此,它们有一个内核浮动的纯Ruby实现,如下所示:
这为您提供了一个正则表达式,它与运行float()时Ruby所做的内部工作相匹配,但没有异常。所以你现在可以做:
这个解决方案的好处在于,因为Rubinius运行并通过Rubyspec,所以您知道这个regex处理Ruby本身处理的边缘情况,并且您可以在字符串上调用f而不必担心! |
![]() |
2
35
这里有一种方法:
如果您想要避免字符串的猴子补丁,您可以将其作为您控制的某个模块的类方法,当然:
|
![]() |
3
8
|
![]() |
4
4
我看到了关于cast+exceptions和regex的未解决的讨论,我认为我将尝试对所有内容进行基准测试,并给出一个客观的答案: 下面是这里尝试的每种方法的最佳情况和最差情况的来源:
MRI193的结果如下:
由于我们只处理线性时间算法,我认为我们使用经验测量来进行归纳。很明显,regex更加一致,只会根据传递的字符串的长度稍微波动一点。在没有失败的情况下,强制转换显然更快,而在有失败的情况下,则要慢得多。 如果我们比较一下成功的时间,我们会发现cast best case比regex best case快了0.3秒。如果我们把它除以最坏情况下的时间量,我们就可以估计出需要多少次运行才能打破平衡,但例外情况是,为了匹配regex的速度,降低了强制转换的速度。大约6秒后,3给了我们20秒。因此,如果性能很重要,并且您希望20个测试中有1个失败,那么就使用cast+异常。 JRuby 1.7.4的结果完全不同:
在最好的情况下,CAST的速度只略快(约10%)。假设这个差异适合进行归纳(我不认为是),那么盈亏平衡点在200到250次运行之间,只有1次导致异常。 所以只有当真正的异常情况发生时,才应该使用异常,这是您和您的代码库的决定。当不使用代码时,它们所在的代码可以更简单、更快。 如果性能无关紧要,那么您可能应该遵循您的团队或代码库已经拥有的任何约定,并忽略整个答案。 |
![]() |
5
3
嗯,如果你不想例外,那么也许: def is_float?(fl) fl =~ /(^(\d+)(\.)?(\d+)?)|(^(\d+)?(\.)(\d+))/ end 因为OP特别要求一个无例外的解决方案。基于regexp的解决方案速度稍慢: require "benchmark" n = 500000 def is_float?(fl) !!Float(fl) rescue false end def is_float_reg(fl) fl =~ /(^(\d+)(\.)?(\d+)?)|(^(\d+)?(\.)(\d+))/ end Benchmark.bm(7) do |x| x.report("Using cast") { n.times do |i| temp_fl = "#{i + 0.5}" is_float?(temp_fl) end } x.report("using regexp") { n.times do |i| temp_fl = "#{i + 0.5}" is_float_reg(temp_fl) end } end 结果: 5286 snippets:master!? % user system total real Using cast 3.000000 0.000000 3.000000 ( 3.010926) using regexp 5.020000 0.000000 5.020000 ( 5.021762) |
![]() |
6
2
试试这个
|
![]() |
7
2
这种支持
来源: https://github.com/ruby/ruby/blob/trunk/object.c#L2934-L2959 |
![]() |
8
1
我试图将此添加为注释,但显然注释中没有格式: 另一方面,为什么不把它作为转换函数,比如
这当然是你一开始不想做的。我想答案是,“如果您真的不想使用异常处理,那么必须编写自己的函数,但是,为什么要这样做?” |
![]() |
cluster1 · 采取独立的新行动的好处是什么? 6 月前 |
![]() |
Robert · 使用JSON或哈希时,将NULL替换为NIL 7 月前 |
![]() |
Fred Willmore · Rails控制器不呈现任何模板 1 年前 |
![]() |
Diogo Amaral · 实现API请求的正确方式 1 年前 |
![]() |
Meknassih · 在控制器方法中分配给模型没有任何作用 1 年前 |
![]() |
Michael Ding · Rails上的默认会话到期问题 1 年前 |
|
Flávio · 基于另外两个生成数组 1 年前 |