首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby中的字符串连接与插值

Ruby中的字符串连接与插值
EN

Stack Overflow用户
提问于 2012-04-10 00:46:39
回答 3查看 32.2K关注 0票数 80

我刚刚开始学习Ruby (第一次编程),并且有一个关于变量的基本语法问题,以及各种编写代码的方式。

Chris Pine的“学习编程”教会了我如何编写这样的基本程序……

代码语言:javascript
复制
num_cars_again= 2
puts 'I own ' + num_cars_again.to_s + ' cars.'

这很好,但后来我偶然发现了关于ruby.learncodethehardway.com的教程,并被教导要像这样编写完全相同的程序……

代码语言:javascript
复制
num_cars= 2
puts "I own #{num_cars} cars."

它们都输出相同的东西,但显然选项2是一种更短的方法。

有什么特别的理由让我使用一种格式而不是另一种格式吗?

EN

回答 3

Stack Overflow用户

发布于 2012-04-10 01:01:22

@user1181898 - IMHO,这是因为它更容易看到正在发生的事情。根据@Phrogz的观点,字符串插值会自动为您调用to_s。作为一个初学者,你需要看到“幕后”发生了什么,这样你才能学习概念,而不仅仅是死记硬背。

把它想象成学习数学一样。你学习“长”的方法是为了理解概念,这样一旦你真正知道你在做什么,你就可以走捷径。从我的经验来看,我对Ruby还不是很在行,但我已经犯了足够多的错误,建议人们不要做什么。希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2016-11-15 10:08:03

如果您使用字符串作为缓冲区,我发现使用连接(String#concat)会更快。

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
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

在猜测中,我会说插值生成了一个临时字符串,这就是为什么它更慢。

票数 2
EN

Stack Overflow用户

发布于 2020-02-06 19:34:01

这是一个完整的基准测试,它还比较了Kernel#formatString#+,因为据我所知,它们都是用ruby构造动态字符串的方法

代码语言:javascript
复制
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的结果

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10076579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档