Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是否更喜欢%w(…)而不是文字数组?_Ruby - Fatal编程技术网

Ruby 是否更喜欢%w(…)而不是文字数组?

Ruby 是否更喜欢%w(…)而不是文字数组?,ruby,Ruby,在RubyMine中输入字符串的简单文字数组时: cols = [ "Col1", "Col2" ] RubyMine抱怨我更喜欢使用%w而不是文字数组: cols = %w(Col1 Col2) 它提供了一个指向Ruby风格指南()的链接,其中说: 当您需要一个数组时,首选%w而不是文字数组语法 字符串 我可以看到%w如何提供可能更简洁的代码。除了简洁之外,还有什么理由选择一种方法而不是另一种方法吗!,一个基准: require 'benchmark' n = 1_000_000

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

cols =
[
  "Col1",
  "Col2"
]
RubyMine抱怨我更喜欢使用
%w
而不是文字数组:

cols = %w(Col1 Col2)
它提供了一个指向Ruby风格指南()的链接,其中说:

当您需要一个数组时,首选%w而不是文字数组语法 字符串

我可以看到
%w
如何提供可能更简洁的代码。除了简洁之外,还有什么理由选择一种方法而不是另一种方法吗!,一个基准:

require 'benchmark'

n = 1_000_000
Benchmark.bm(11) do |b|
  b.report('%w') { n.times { %w[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('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)
我添加了“numerics”数组测试,因为我怀疑
%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
的速度一直都有点快,这可能会引起速度传闻。

链接的指南非常固执己见,我认为人们不会真正遵守所描述的每一条规则。我不认为有规则告诉任何人不要使用文字数组,在我看来这实际上是一个时间问题taste@AnthonyAlberto:这与我多年来看到的许多风格指南是一致的。由于我无意中发现的不仅仅是一些随机样式指南,而是IDE本身提出的建议,我想知道我应该更喜欢
%w
——而不是IDE说“做ABC”意味着我应该做ABC……参考我发布的基准测试结果,我认为使用
%w
的优势在于它可以得到更清晰的定义,而不需要太多的维护。从长远来看,维护是一项巨大的成本。顺便说一句:两者都是文字数组。这个问题不应该解决。这是一个具体的、可以回答的问题。这是没有争议的。文字数组和用
%w
语法声明的数组之间既有区别,也没有区别。+1:Nice。在这里至少学到了三件事,两件事完全一样。即使有任何性能差异,也只能在解析期间进行。运行时性能不可能有任何差异,因为两者完全相同。因为整个文件在基准测试启动之前就已经被解析了,所以整个基准测试毫无意义。您需要使用
eval
load
或类似的方法来延迟解析,直到基准测试启动之后。@JörgWMittag您断言它们是完全相同的东西;但这只有在拥有足够智能的编译器时才是正确的w{…}始终是一个文本数组,而
[…]
可以是一个文本数组、表达式数组或混合数组。编译器可以在解析后分析数组,以了解它是一个文本数组,因此可以在代码生成时完全构造它,但这并不是一个完全琐碎的优化,我们应该始终假设您在没有文档、测试或代码检查的情况下得到它。@dbenhur:这里不需要智能编译器。在JRuby和Rubinius上,两段代码都被解析为完全相同的AST,甚至在它们到达编译器之前。在YARV上,ast略有不同,但生成的字节码是相同的:
putstring'a';输入字符串“b”;输入字符串'c';新阵列3。请注意,YARV编译器不是SSC,相反:它是一个相当愚蠢的编译器。@JörgWMittag ruby实现非常简单。我甚至不确定mri是否进行简单的编译时常量表达式计算。我的观点是,不能假设%w{}和[literals]都会编译成相同的代码和数据,而不进行实际调查。您可以通过向编译器代码发送指向编译器代码的指针来反复声明它们是这样做的,但没有进行演示,这让我们看清楚了,或者向我们展示了一个示例AST/字节码输出来演示它们的等价性。轻视通过基准测试进行调查的尝试而不证明您的断言是令人讨厌的。
                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)