Ruby 这条红宝石线是怎么说的?

Ruby 这条红宝石线是怎么说的?,ruby,syntax,operator-keyword,Ruby,Syntax,Operator Keyword,我正在使用一个自定义渲染器,我使用了一些来自另一个站点的复制粘贴。我似乎不知道这件作品在这里做什么 "#{options[:callback]}(#{data})" 下面是完整上下文中的一段代码 ActionController.add_renderer :as3 do |data, options| data = ActiveSupport::JSON.encode(data) unless data.respond_to?(:to_str) data = "#{opti

我正在使用一个自定义渲染器,我使用了一些来自另一个站点的复制粘贴。我似乎不知道这件作品在这里做什么

"#{options[:callback]}(#{data})"
下面是完整上下文中的一段代码

  ActionController.add_renderer :as3 do |data, options|
    data = ActiveSupport::JSON.encode(data) unless data.respond_to?(:to_str)
    data = "#{options[:callback]}(#{data})" unless options[:callback].blank?
    self.content_type ||= Mime::JSON
    self.response_body = data
  end

这是简单的字符串插值。它将生成如下字符串,
callback
options[:callback]
的值,
value
是变量
数据中的任何内容

"callback(value)"
在Ruby中,双引号字符串通过
{}
语法支持插值。也就是说,如果变量
x
包含值
3
,则字符串
“x的值为#{x}”
将计算为
“x的值为3”
。在
#{}
中,可以有任意复杂的Ruby表达式,包括数组/哈希索引。因此,字符串的第一部分,
“{options[:callback]}”
只是将
options[:callback]
的值替换到字符串中

下一部分,
()
只是原始字符串数据,而不是可执行代码。在
()
中,您有第二个
{}
替换
数据。如果用
x
y
替换这两个变量取代基,可能会更清楚:

 x = 3
 y = 4
 "#{ x }(#{ y })"

以上内容将计算为字符串
“3(4)”

这是简单的字符串插值。它将生成如下字符串,
callback
options[:callback]
的值,
value
是变量
数据中的任何内容

"callback(value)"
在Ruby中,双引号字符串通过
{}
语法支持插值。也就是说,如果变量
x
包含值
3
,则字符串
“x的值为#{x}”
将计算为
“x的值为3”
。在
#{}
中,可以有任意复杂的Ruby表达式,包括数组/哈希索引。因此,字符串的第一部分,
“{options[:callback]}”
只是将
options[:callback]
的值替换到字符串中

下一部分,
()
只是原始字符串数据,而不是可执行代码。在
()
中,您有第二个
{}
替换
数据。如果用
x
y
替换这两个变量取代基,可能会更清楚:

 x = 3
 y = 4
 "#{ x }(#{ y })"

上述内容将计算为字符串
“3(4)”

,这是将JSON响应转换为JSONP;想象一下
数据
是:

'{"some": "thing", "goes": "here"}'
JSONP声明数据应该包装在JavaScript函数调用中。因此,如果
选项[:callback]
是字符串
test
(要调用的函数的名称),则生成的JSONP将是:

'test({"some": "thing", "goes": "here"})'

这是将JSON响应转换为JSONP;想象一下
数据
是:

'{"some": "thing", "goes": "here"}'
JSONP声明数据应该包装在JavaScript函数调用中。因此,如果
选项[:callback]
是字符串
test
(要调用的函数的名称),则生成的JSONP将是:

'test({"some": "thing", "goes": "here"})'

它是一个模板,用插入字符串
:callback
所指向的选项值替换第一个字段,并用
数据的内容替换参数内的第二个字段

"callback(value)"
我敢打赌,结果字符串将在其他地方求值,在那里它将成为对过程的调用。这将像这样工作:

options[:callback] = "foo"
data="arg,arg,arg"
(注意,数据被编码为JSON,因此作为数据传递的字符串是JSON字符串

然后字符串变成“foo(arg.arg.arg)”,当它被求值时,它变成了对带有这些参数的例程
foo
的调用

更新:


实际上,关于Ruby eval,我要回顾一下——虽然这会起作用,但它更可能变成一个Javascript函数调用。这样,您就可以将Javascript函数的名称作为字符串传递,代码将返回相应的回调函数供Javascript稍后执行。

这是一个替代fir的模板包含由插入字符串
:callback插入的选项值的st字段,以及包含
数据内容的参数内的第二个字段

"callback(value)"
我敢打赌,生成的字符串将在其他地方求值,在那里它将成为对过程的调用。其工作原理如下:

options[:callback] = "foo"
data="arg,arg,arg"
(注意,数据被编码为JSON,因此作为数据传递的字符串是JSON字符串

然后字符串变成“foo(arg.arg.arg)”,当它被求值时,它变成了对带有这些参数的例程
foo
的调用

更新:

实际上,关于Ruby eval,我要回溯一下——虽然这会起作用,但它更可能变成一个Javascript函数调用。这样,您就可以将Javascript函数的名称作为字符串传递,代码将返回相应的回调函数供Javascript稍后执行。

您可以重写

"#{options[:callback]}(#{data})"
作为

你可以重写

"#{options[:callback]}(#{data})"
作为

不,#{}符号是字符串插值。对——我认为从技术上讲是正确的,我应该用引号把行括起来。我还怀疑我把这个问题误解为“这段代码的目的是什么”,而不是字面上的“它在做什么”。:)不,是#{}表示法是字符串插值。对——我认为从技术上讲是正确的,我应该用引号将行括起来。我还怀疑我误解了这个问题“这段代码的目的是什么”,而不是字面上的“它在做什么”。:)