我想知道哪种方法在比较两个类时更有效。方法一:
a = '123' a.class.name == 'String'
方法二:
a = '123' a.kind_of? String
任何指点将不胜感激。谢谢!
cnjp1d6j1#
我认为is_a?是正确的。不是因为性能,而是因为正确性。在你的应用中有多个String类是很好的,因此仅仅比较类名是不够的。.class.name == 'String'只返回类名为“String”的类,但它不会告诉你它是否是在当前上下文中调用String时返回的String类。而kind_of?不仅检查a是否是String的instance,如果a是String的子类的instance,它还会返回true。你问了什么方法是最有效的,但没有告诉你如何在你的问题的上下文中定义有效。is_a?是最短的,我认为这是有效的。当你考虑性能时,让我们看看这个:
is_a?
String
.class.name == 'String'
kind_of?
a
true
require 'benchmark/ips' string = "123" Benchmark.ips do |x| x.report("name == name") { string.class.name == "String" } x.report("kind_of?") { string.kind_of?(String) } x.report("is_a?") { string.is_a?(String) } end Warming up -------------------------------------- name == name 585.361k i/100ms kind_of? 1.173M i/100ms is_a? 1.299M i/100ms Calculating ------------------------------------- name == name 5.870M (± 4.6%) i/s - 29.853M in 5.099899s kind_of? 12.803M (± 3.0%) i/s - 64.514M in 5.043457s is_a? 12.971M (± 3.6%) i/s - 64.935M in 5.012808s
is_a?也是最快的。
1条答案
按热度按时间cnjp1d6j1#
我认为
is_a?
是正确的。不是因为性能,而是因为正确性。在你的应用中有多个
String
类是很好的,因此仅仅比较类名是不够的。.class.name == 'String'
只返回类名为“String”的类,但它不会告诉你它是否是在当前上下文中调用String
时返回的String
类。而
kind_of?
不仅检查a
是否是String
的instance,如果a
是String
的子类的instance,它还会返回true
。你问了什么方法是最有效的,但没有告诉你如何在你的问题的上下文中定义有效。
is_a?
是最短的,我认为这是有效的。当你考虑性能时,让我们看看这个:is_a?
也是最快的。