Ruby:end.join()是什么意思?

dee*_*gle -2 ruby loops

几周前,我问了一个问题,如何输出哈希

以表格形式输出哈希

多亏了很棒的社区,我得到了回应。

roster =
  students.map do |s|
    s.values.map do |f|
      f.to_s.ljust(FIELD_SIZE) # 1 row
    end.join('   ')            # join columns with spaces
  end.join($/)                 # join rows with OS-dependent CR/LF
Run Code Online (Sandbox Code Playgroud)

它适用于该项目,但是几周后,当我重新访问代码时,我意识到该变量中存在循环,并且具有end.join()

这是什么意思end.join() ,又是什么roster?是绳子吗?数组?

谢谢!

Ale*_*kin 6

由于我从字面上知道此代码,因此我有责任回答。

  1. 是什么roster?是绳子吗?数组?

您基本上是在浪费时间在SO上发布此类问题。打开任何红宝石REPL,例如标准irb和类型:

irb|1 ? :foo.class
#? Symbol
irb|2 ? "foo".class
#? String
irb|3 ? roster.class
#? String
Run Code Online (Sandbox Code Playgroud)

这样一来,人们便可以立即得到答案“此变量是什么类型”。

  1. 这是什么意思 end.join()

这是方法链接。ruby中的方法可能需要零个参数,一些参数,还有一些参数和一个block。后者可以用大括号表示:

#              ?            ?  HERE
[1, 2, 3].each { |e| puts e }
Run Code Online (Sandbox Code Playgroud)

或者do- end

#              ??            ???  HERE
[1, 2, 3].each do |e| puts e end
Run Code Online (Sandbox Code Playgroud)

这些表示法之间有一些细微的差异,但目前与主题无关。

到目前为止,方法可能会被束缚起来。从根本上讲,这意味着在前一种方法的结果上调用后一种方法:

#                           ?  HERE
[1, 2, 3].map { |e| e ** e }.each { |e| puts e }
Run Code Online (Sandbox Code Playgroud)

这与以下内容完全相同:

intermediate_result = [1, 2, 3].map { |e| e ** e }
intermediate_result.each { |e| puts e }
Run Code Online (Sandbox Code Playgroud)

同样,方法可能在使用do- end表示法时被链接起来。

最后,ruby [几乎]在代码中的任何地方都允许有额外的空格,以提高代码的可读性:

#                              ?  HERE
[1, 2, 3].map do |e| e ** e end.each do |e| puts e end
Run Code Online (Sandbox Code Playgroud)

要么

[1, 2, 3].map do |e|
  e ** e
end.each do |e|
  puts e
end
Run Code Online (Sandbox Code Playgroud)