首选%w(…)到文字数组?

在RubyMine中输入一个简单的文字字符串数组时:

cols = [ "Col1", "Col2" ] 

RubyMine抱怨我应该在文字数组上使用%w

 cols = %w(Col1 Col2) 

它提供了一个Ruby样式指南( 这里 )的链接,其中说:

当需要字符串数组时,首选%w到文字数组语法。

 # bad STATES = ['draft', 'open', 'closed'] # good STATES = %w(draft open closed) 

我可以看到%w如何提供可能更简洁的代码。 除了简洁,有没有理由更喜欢一种方法而不是另一种方法?

瞧!,一个基准:

 require 'benchmark' n = 1_000_000 Benchmark.bm(11) do |b| b.report('%w') { n.times { %w[abcdefghijklmnopqrstu vwxyz] } } b.report('explicit') { n.times { ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] } } b.report('numerics') { n.times { [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26] } } end user system total real %w 2.590000 0.000000 2.590000 ( 2.591225) explicit 2.590000 0.000000 2.590000 ( 2.584781) numerics 0.300000 0.000000 0.300000 ( 0.309161) user system total real %w 2.590000 0.000000 2.590000 ( 2.591516) explicit 2.590000 0.000000 2.590000 ( 2.584155) numerics 0.300000 0.000000 0.300000 ( 0.308896) user system total real %w 2.590000 0.000000 2.590000 ( 2.592848) explicit 2.590000 0.000000 2.590000 ( 2.585558) numerics 0.300000 0.000000 0.300000 ( 0.308570) 

我添加了“数字”arrays测试,因为我怀疑%w比使用显式字符串更快,因为测试了字符串。 %w不需要这样做,因为它假设一切都是字符串。 在运行三次之后,就处理字符串而言,这是一次洗涤。 数字规则,字符串流口水,以及所有这些。


以前的基准测试是在我的系统上使用Ruby 1.9.3-p286运行的。 我在家里使用我的旧MacBook Pro再次测试,使用Ruby 1.8.7-p358,因此由于托管硬件的差异以及运行旧版Ruby,以下数字较慢:

  user system total real %w 3.070000 0.000000 3.070000 ( 3.080983) explicit 3.100000 0.000000 3.100000 ( 3.093083) numerics 0.950000 0.040000 0.990000 ( 0.990535) user system total real %w 3.080000 0.010000 3.090000 ( 3.076787) explicit 3.090000 0.000000 3.090000 ( 3.089246) numerics 0.950000 0.030000 0.980000 ( 0.989579) user system total real %w 3.080000 0.000000 3.080000 ( 3.073877) explicit 3.090000 0.000000 3.090000 ( 3.091576) numerics 0.950000 0.030000 0.980000 ( 0.989132) 

在1.8.7, %w持续一点点快,这可能引起了速度谣言。