这里是Ruby新手,正在try 为我创建的一个类输出一个实例的内容.我不认为这有什么关系,但下面的KNOWN_var是从数组中检索的.我要说的话很简单:

for known_var in @known_variables
  puts "known_var is #{known_var}"

我得到的结果是一致的格式:

resistance = 2200 Ohmsknown_var is #<Variable:0x000001e21047f920>

该类确实有一个定制的TO_S定义,这就是为什么第一个块的格式是这样的:

def to_s
    if @value == nil
    print "#@full_name = 0"
    else print "#@full_name = #@value #@unit"
    end
end

但是,我不确定为什么这会出现在字符串的"known_var is"部分之前.它看起来类似,如果我指定:

puts "known_var is #{known_var}"

减go 可变部分,这就说得通了:

amperage = 12 Aknown_var is

如果我希望它只按PUTS中提供的顺序输出文本:"KNOWN_var is XXXXXX",是否应该做一些不同的操作?

我已经搜索了几次,看是否能找到一个解释(到目前为止还没有运气).我可以通过将看跌期权分成两行来解决这个问题,但这不是我想要做的,更重要的是,我想了解为什么看跌期权是以这种方式进行排序的.

推荐答案

puts不是订购任何东西.让我们构造一个玩具示例,然后跟踪整个执行过程.

class Foo
  def to_s
    print "[In to_s]"
    "42"
  end
end

def test
  foo = Foo.new
  puts "foo is #{foo}"
end

就像你说的,运行test个 fingerprint [In to_s]foo is 42个.多么?

  • test中:构造新的Foo,并将其分配给foo
  • 字符串"foo is #{foo}"需要求值,以便将其作为参数传递给puts函数
  • 要做到这一点,需要判断foo.to_s
  • to_s打印[In to_s]时不带换行符(因为这是print所做的,不像puts)
  • to_s返回"42"(Ruby函数返回最后求值的表达式,除非执行显式的return语句)
  • 现在我们知道foo.to_s的值是("42"),我们可以计算"foo is #{foo}":它是"foo is 42"
  • puts被执行,参数为"foo is 42"
  • "foo is 42"是输出,紧跟在之前输出的[In to_s]之后.

正如Rajagopalan所指出的,to_s应该创建对象的字符串表示;它不应该输出任何内容.一旦有了字符串表示,我就可以决定是否打印它.例如,如果bar = foo.to_s输出任何东西,那将是非常奇怪的-我只想将foo的文本表示存储到一个变量中.

Ruby相关问答推荐

Ruby PKCS7:添加;\r〃;字节正在 destruct 解密

当Ruby `Complex` 类除了`==` 之外没有任何关系运算符时,它的祖先怎么能有`Comparable`?

RSpec 是否有 python 类似功能来做 TDD?

ri 和 rdoc 有什么区别

从 ruby​​ 脚本运行另一个 ruby​​ 脚本

将块传递给方法传递给Ruby中的另一个方法

在 YAML 变量中包含 jekyll / liquid 模板数据?

Ruby:如何计算相对于另一个路径的路径?

Ruby:如何卸载设计(uninstall Devise)?

ruby 是否支持 case 语句中的范围?

在单个 node 上使用 XPath 返回所有 node 中的元素

符号到字符串问题

在 Selenium WebDriver 中按 Ctrl + A

在 ruby​​ 中将每个数组元素添加到文件的行中

在 Ruby 中,有没有办法使用 hash.each_with_index do |[k,v], i| 之类的东西?

我应该在我的 ruby​​ 脚本中定义一个 main 方法吗?

Ruby 1.9:如何正确大写和小写多字节字符串?

哪个键/值存储最有前途/最稳定?

将整个文本文件作为单个字符串读取的合理方法是什么?

传递块时 Array#sort 如何工作?