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/4/string/5.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
为什么是#{String}";Ruby中的一个常见习语_Ruby_String - Fatal编程技术网

为什么是#{String}";Ruby中的一个常见习语

为什么是#{String}";Ruby中的一个常见习语,ruby,string,Ruby,String,我认识的一个Ruby开发人员问了这个问题;我的答案如下。。。还有其他更好的理由吗 为什么有那么多Ruby程序员这么做 "#{string}" 而不是 string 由于第二种形式更简单、更有效?当您以后需要做的不仅仅是获取字符串的值,而且在使用时还要对其进行预处理/追加时,较小的更改似乎是我能找到的该习惯用法的最佳动机。这是Ruby开发人员常用的习惯用法吗?我看的不多。也许将任何字符转换为字符串是一种简单的方法?因为它与调用to_s方法相同。但这是非常奇怪的方式:) 一些用法的大背景是什么?

我认识的一个Ruby开发人员问了这个问题;我的答案如下。。。还有其他更好的理由吗

为什么有那么多Ruby程序员这么做

"#{string}"
而不是

string

由于第二种形式更简单、更有效?

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

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

也许将任何字符转换为字符串是一种简单的方法?因为它与调用
to_s
方法相同。但这是非常奇怪的方式:)


一些用法的大背景是什么?除了前面提到的之外,我唯一能想到的是在类型安全方面的松散尝试;也就是说,您可能会收到任何作为参数的内容,这可以确保您传入的内容都像鸭子一样行走……或者,是字符串(尽管
string.to_s
可能更清晰)


不过,总的来说,这可能是一种代码气味,沿途有人认为这是最佳实践。

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


如果有人告诉我这是最好的做法,我会飞快地跑开

只有一种情况推荐使用这种习惯用法:

fname = 'john'
lname  = 'doe' 
name = "#{fname} #{lname}"
上述代码比以下代码更有效:

name = fname + ' ' + lname


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

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

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

我使用这种代码,这样我就可以将
nil
作为字符串传递,它仍然可以处理字符串,而不会看到一些异常:

def short(string = nil)
  "#{string}"[0..7]
end
如果已经在引号中,添加一些调试代码会更容易/更快


简而言之,这更方便。

我不同意这个问题的前提。根据我的经验,如果有人这样做,通常是一个错误(字符串之前包含了其他内容,他在删除其他内容时忘记了删除引号),或者这个人根本不理解ruby中的字符串。可能是
“{string}”
,而不是
“{string}”
,不管怎么说,这并不常见。你能用一个稍微充实一点的例子来澄清一下吗?或者甚至可以是你见过的某个地方的链接?如果你是说有人按照
str=“#{“hello”}”
的思路写东西,我不相信这是一个非常普遍的习惯用法。@sepp2k:前提是,显然,在twitter上问这个问题的开发人员在他正在做的项目中看到了很多…@fl00r-是的,这就是用法,正如问题标题所指出的,也许这是来自ruby特定背景的程序员的一个常见习惯用法?我在这里转述一个问题,所以我对“这并不是那么普遍,它就像你们所想的那个样错误”的答案非常满意。这是程序员中一个普遍的习语,他们并没有考虑过自己在做什么。我在Perl代码中也看到了同样的事情,这让我很恼火。提醒你,这是一个非常糟糕的动机,但我可以听到PHB的发音作为这样做的理由。PHB的LOL试图理解是什么让程序员更高效:)#{a}是4次击键。a、 to_s为6次击键保存2次击键。这就是“容易”的字面定义;-)。是的,这只是一个建议:)我不喜欢使用“习语”这个主题,问题是Ruby 1.9中的a.to_不能做到这一点。@ScottD-在Ruby 1.8中也不能做到这一点。至少,对我来说不是。在数组的情况下,它当然会返回“123”(不是“1,2,3”)。gah,需要再清醒一下,没有看到其他注释指向…
name=“%s%s”%[fname,lname]
"#{'bla'}"           => "bla"
"#{%r([a-z])}"       => "(?-mix:[a-z])"
"#{{:bla => :blub}}" => "blablub"
def short(string = nil)
  "#{string}"[0..7]
end