没有参数的 `<<`(双小于号)是什么意思?

5

我发现这个方法在 formtastic Gem 中,我想覆盖它。该方法如下:

def to_html
  input_wrapping do
    hidden_field_html <<
    label_with_nested_checkbox
  end
end

第三行的 << 做什么用?我知道它在数组中的作用,但是在这里我不知道。

hidden_field_html 应该是一个 arraystring,并且 label_with_nested_checkbox 被添加到其中。标准规定您的代码不应超过80列,因此可能是由于这个原因它被写成了两行。 - Deepesh
2个回答

8
您可以这样阅读它:
hidden_field_html << label_with_nested_checkbox
label_with_nested_checkbox 是被连接到 hidden_field_html 末尾的参数 - 他们将其拆分成两行以增加“清晰度”。

第四行可能应该缩进2个空格,至少我会这样做。 - Jörg W Mittag

1
  1. 在类继承中使用的是<而不是<<,前者通常与方法<<无关。

  2. Ruby对空格缩进有很高的容忍度;几乎可以在函数调用和参数之间放置任意数量的空格,包括换行符。

例如:

'aaa'.
  length
#⇒ 3

并且

'aaa'
  .length
#⇒ 3

两者都是完全有效的。

  1. <<是通用方法,可以在任何类中被覆盖。这里应该是String#<<方法,将参数原地追加到字符串接收器中。

一般来说,任何任意类都可以重写此方法:

class A
  attr_accessor :var
  def initialize
    @var = 5
  end
  def << value
    @var += value
  end
end

a = A.new
a.var
#⇒ 5
a << 37
a.var
#⇒ 42

所以他们使用自定义的<<方法?谢谢! :) - Bergrebell
1
不,正如我所说,他们应该使用String#<<。您可以通过检查接收器类来验证此操作:puts hidden_field_html.class.to_s - Aleksei Matiushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接