代码之家  ›  专栏  ›  技术社区  ›  Tetsujin no Oni

为什么“字符串”在Ruby中是一个常见的习惯用法?

  •  2
  • Tetsujin no Oni  · 技术社区  · 14 年前

    一个我认识的红宝石开发者问了这个问题;我的答案如下…还有其他更好的理由吗?

    为什么这么多Ruby程序员会这么做?

    "#{string}"
    

    而不是

    string
    

    既然第二种形式更简单、更有效?

    8 回复  |  直到 11 年前
        1
  •  12
  •   scottd    14 年前

    这是Ruby开发人员常用的习惯用法吗?我看不太清楚。

        2
  •  3
  •   Tetsujin no Oni    14 年前

    当您以后需要做的不仅仅是获取字符串的值,而且在使用点对其进行预处理/追加时,较小的更改似乎是我能找到的关于该习惯用法的最佳动机。

        3
  •  3
  •   Alain Ravet    14 年前

    只有一种情况下,这是推荐的习惯用法:

    fname = 'john'
    lname  = 'doe' 
    name = "#{fname} #{lname}"
    

    上面的代码比:

    name = fname + ' ' + lname
    

    name = [fname, lname].join(' ')
    
        4
  •  2
  •   Marc Bollinger    14 年前

    一些用法的更广泛背景是什么?除了前面提到的,我唯一能想到的就是对类型安全的一种松散的尝试;也就是说,你可以接受任何东西作为论据,这可以确保你传递的东西像鸭子一样行走……或者,嗯,一个字符串(尽管 string.to_s 可能会更清楚)。

    一般来说,这可能是一种代码味道,一路上有人认为这是最佳实践。

        5
  •  2
  •   kulpae    11 年前

    我使用这种代码,这样我就可以通过 nil 作为字符串,它仍然可以在字符串上工作,而不是看到一些异常在飞:

    def short(string = nil)
      "#{string}"[0..7]
    end
    

    如果调试代码已经用引号括起来了,那么附加它就更容易/更快了。

    简而言之:这更方便。

        6
  •  0
  •   Marnen Laibow-Koser    14 年前

    有趣的答案,大家。我是那个提出原始问题的开发人员。为了提供更多的上下文,我在当前的工作中偶尔会看到这种情况,有时在Rails列表中的示例代码中也会看到这种情况,其中预先知道的变量包含字符串。我可以把它理解为一个替代物,但我不认为这就是这里发生的事情;我认为人们只是忘记了,如果你只是传递一个字符串变量,你不需要使用插值语法。

    如果有人想告诉我这是一个最佳实践,我会以最快的速度逃跑。

        7
  •  0
  •   fl00r    14 年前

    也许这是将任何字符串转换为字符串的简单方法?因为它和call一样 to_s 方法。但这是非常奇怪的方式:)。

    a = [1,2,3]
    "#{a}"
    #=> "123"
    a.to_s
    #=> "123"
    
        8
  •  0
  •   the Tin Man    12 年前

    我可以想象这在被插值的对象不总是字符串的情况下是有用的,因为插值隐式调用 #to_s :

    "#{'bla'}"           => "bla"
    "#{%r([a-z])}"       => "(?-mix:[a-z])"
    "#{{:bla => :blub}}" => "blablub"
    

    当您不太关心输出格式,但从不希望因为参数类型错误而出错时,记录某些内容可能是有意义的。