我刚刚开始学习Ruby (第一次编程),并且有一个关于变量的基本语法问题,以及各种编写代码的方式。
Chris Pine的“学习编程”教会了我如何编写这样的基本程序……
num_cars_again= 2
puts 'I own ' + num_cars_again.to_s + ' cars.'
这很好,但后来我偶然发现了关于ruby.learncodethehardway.com的教程,并被教导要像这样编写完全相同的程序……
num_cars= 2
puts "I own #{num_cars} cars."
它们都输出相同的东西,但显然选项2是一种更短的方法。
有什么特别的理由让我使用一种格式而不是另一种格式吗?
发布于 2012-04-10 01:01:22
@user1181898 - IMHO,这是因为它更容易看到正在发生的事情。根据@Phrogz的观点,字符串插值会自动为您调用to_s。作为一个初学者,你需要看到“幕后”发生了什么,这样你才能学习概念,而不仅仅是死记硬背。
把它想象成学习数学一样。你学习“长”的方法是为了理解概念,这样一旦你真正知道你在做什么,你就可以走捷径。从我的经验来看,我对Ruby还不是很在行,但我已经犯了足够多的错误,建议人们不要做什么。希望这能有所帮助。
发布于 2016-11-15 10:08:03
如果您使用字符串作为缓冲区,我发现使用连接(String#concat
)会更快。
require 'benchmark/ips'
puts "Ruby #{RUBY_VERSION} at #{Time.now}"
puts
firstname = 'soundarapandian'
middlename = 'rathinasamy'
lastname = 'arumugam'
Benchmark.ips do |x|
x.report("String\#<<") do |i|
buffer = String.new
while (i -= 1) > 0
buffer << 'Mr. ' << firstname << middlename << lastname << ' aka soundar'
end
end
x.report("String interpolate") do |i|
buffer = String.new
while (i -= 1) > 0
buffer << "Mr. #{firstname} #{middlename} #{lastname} aka soundar"
end
end
x.compare!
end
结果:
Ruby 2.3.1 at 2016-11-15 15:03:57 +1300
Warming up --------------------------------------
String#<< 230.615k i/100ms
String interpolate 234.274k i/100ms
Calculating -------------------------------------
String#<< 2.345M (± 7.2%) i/s - 11.761M in 5.041164s
String interpolate 1.242M (± 5.4%) i/s - 6.325M in 5.108324s
Comparison:
String#<<: 2344530.4 i/s
String interpolate: 1241784.9 i/s - 1.89x slower
在猜测中,我会说插值生成了一个临时字符串,这就是为什么它更慢。
发布于 2020-02-06 19:34:01
这是一个完整的基准测试,它还比较了Kernel#format
和String#+
,因为据我所知,它们都是用ruby构造动态字符串的方法
require 'benchmark/ips'
firstname = 'soundarapandian'
middlename = 'rathinasamy'
lastname = 'arumugam'
FORMAT_STR = 'Mr. %<firstname>s %<middlename>s %<lastname>s aka soundar'
Benchmark.ips do |x|
x.report("String\#<<") do |i|
str = String.new
str << 'Mr. ' << firstname << ' ' << middlename << ' ' << lastname << ' aka soundar'
end
x.report "String\#+" do
'Mr. ' + firstname + ' ' + middlename + ' ' + lastname + ' aka soundar'
end
x.report "format" do
format(FORMAT_STR, firstname: firstname, middlename: middlename, lastname: lastname)
end
x.report("String interpolate") do |i|
"Mr. #{firstname} #{middlename} #{lastname} aka soundar"
end
x.compare!
end
和ruby 2.6.5的结果
Warming up --------------------------------------
String#<<
94.597k i/100ms
String#+ 75.512k i/100ms
format 73.269k i/100ms
String interpolate 164.005k i/100ms
Calculating -------------------------------------
String#<< 91.385B (±16.9%) i/s - 315.981B
String#+ 905.389k (± 4.2%) i/s - 4.531M in 5.013725s
format 865.746k (± 4.5%) i/s - 4.323M in 5.004103s
String interpolate 161.694B (±11.3%) i/s - 503.542B
Comparison:
String interpolate: 161693621120.0 i/s
String#<<: 91385051886.2 i/s - 1.77x slower
String#+: 905388.7 i/s - 178590.27x slower
format: 865745.8 i/s - 186768.00x slower
https://stackoverflow.com/questions/10076579
复制相似问题