【问题标题】:Why does white-space affect ruby function calls?为什么空格会影响 ruby​​ 函数调用?
【发布时间】:2025-12-25 20:40:06
【问题描述】:

我收到此代码的语法错误

render json: {
    "what" => "created", 
    "whatCreated" => "thing",
    "htmlOutput" => render_to_string (partial: "some_partial")
}

但我不使用此代码:

render json: {
    "what" => "created", 
    "whatCreated" => "thing",
    "htmlOutput" => render_to_string(partial: "some_partial")
}

render_to_string 破坏了我的 rails 应用程序之后的那个空间怎么来的?

【问题讨论】:

    标签: ruby syntax whitespace


    【解决方案1】:

    问题是,ruby 中的方法可以带或不带括号运行。 例如,您可以运行Array.new 1,2 并且ruby 知道它接收空格之后的参数。你也可以运行 Array.new(1,2) 并且 ruby​​ 知道 args 在括号内。

    但是,当你运行 Array.new (1,2) 时,ruby 认为它会在空格之后接收参数,但实际上它会接收一个元组 (1,2),并且基本上与 Array.new((1,2)) 完全相同

    所以底线:

    Array.new (1,2) == Array.new((1,2)) 这是一个语法错误,因为 (1, 2) 文字不是有效的

    【讨论】:

    • 好的,你用我的例子来解释根本问题,但是为什么要标记我的答案呢?
    • 当然 ruby​​ 可以更聪明,并且不假设元组,除非这是预期的参数(数组是一个稍微不同的问题,但 render_to_string?(实际上我不知道 render_to_string 接受什么,但有大量接受特定参数的方法)
    • 不一样,完全一样,都是方法
    • 是的,但是数组可以用变量填充,虚构的方法integer_to_string只能取一个整数
    【解决方案2】:

    作为一般的 Ruby 风格指南,您不应该在参数列表括号之前放置空格。这与rails无关,而是与Ruby语言有关。试试下面的看看:

    Array.new(1,2) # => [2]
    Array.new (1,2) # = > SyntaxError: unexpected ',', expecting ')'
    Array.new(1) # => [nil]
    Array.new (1) # => [nil]
    

    正如您在第二个示例中看到的代码损坏了,解释器期望找到),但找到了,。但是在最后一个示例中,它并没有中断。

    【讨论】:

    • 谢谢。 Doh ruby​​ not rails (固定问题)......你知道为什么吗?
    • 见 Dima 的解释