ruby - 为什么这些输出不同?

标签 ruby

这两个有不同的输出。

aArray = [[1,2],[2,3],[3,4]]

aArray.each {|subArray| puts subArray}

aArray.each {|subArray| puts "#{subArray}"}

第一个 each 语句单独打印数组中的所有数字,而第二个语句打印所有子数组。

“#”在这种情况下有什么神奇的作用?

最佳答案

您问题中的示例是嵌套哈希这一事实并没有什么区别,因此我会将您的问题简化为:

为什么这两个示例打印出不同的输出?

puts [1,2,3]
# 1
# 2
# 3

puts "#{[1,2,3]}"
# [1, 2, 3]

来自 puts 的文档:

[...] If called with an array argument, writes each element on a new line. Each given object that isn’t a string or array will be converted by calling its to_s method. [...]

也就是说:

puts [1,2,3]

被解释为:

[1,2,3].each do |element|
  puts element
end

基本相同的是:

puts 1
puts 2
puts 3

并单独在一行中打印数组的每个元素。

而您的第二个示例的工作方式不同:

puts "#{[1,2,3]}"

第一步将进行字符串插值。这意味着 Ruby 将评估 "#{[1,2,3]}" 部分。字符串插值是通过对 #{} 中的表达式调用 to_s 来完成的。调用 [1,2,3].to_s 将返回字符串(不是数组)'[1,2,3]'。该字符串被插入到插值位置的外部字符串中。结果是 Ruby 在第二步中打印成一行的一个字符串。为了说明每个步骤:

puts "#{[1,2,3]}"
puts "#{[1,2,3].to_s}"
puts "#{'[1,2,3]'}"
puts "[1,2,3]"
# [1,2,3]

关于ruby - 为什么这些输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46492790/

相关文章:

ruby - 如何使用 Ruby OpenSSL 库解码/提取 SMIME 签名电子邮件的 smime.p7m 文件内容

ruby - 为什么我不能从 ruby​​ 中的类方法中调用 include?

ruby-on-rails - 来自 Rails 4.2 图像缓存的特定图像将不会更新,无论我们尝试什么

ruby-on-rails - 在 Rails 中提供当前日期

ruby - 为什么ruby中有类变量?

ruby - 获取时间戳 1224642020 的 Date 对象的最佳方法是什么?

用 "*"替换每个字符\d 的 Ruby 单行正则表达式?

ruby-on-rails - 无法使用 CTRL-C 停止 Rails 服务器

ruby - 在 Ruby ActiveRecord 中创建和更新时忽略 'read-only' 列

ruby-on-rails - 生成重置密码 token 不保存在模型上