【问题标题】:Output one attribute at the time with to_str usage in Ruby在 Ruby 中使用 to_str 时输出一个属性
【发布时间】:2026-01-06 06:25:01
【问题描述】:

假设我有一个具有许多属性的类,但一次只需要一个属性,即

A级 attr_accessor :名称 attr_accessor :other1 attr_accessor :other2 attr_accessor :other3 attr_accessor :other4 结尾

并且希望一次只输出一个属性:

a = A.新 把 a.name.to_str

成为:

a 的名称值:value_of_name

最好的方法是什么?

【问题讨论】:

  • 方法a.name是做什么的?您可能想要覆盖 to_s 方法而不是添加 to_str 方法 - to_s 是 Ruby 用来确定对象的字符串表示形式的方法。实际上是 a.to_s 你想成为 Name for a.. 而不是 a.name.to_s
  • 你为什么需要 to_str 的名字?不是已经是字符串了吗?
  • 类A的属性很多,用a.name.to_str我只想获取字符串格式的name属性,以及父对象的名字。
  • 我认为他想改变它的输出方式。
  • 我原本以为我理解了这个问题......所有这些中的name方法在哪里?

标签: ruby


【解决方案1】:

编辑:

您不会考虑在类中创建一个为您执行此操作的方法吗?

def as_string(sym)
  "value of #{sym.to_s}: #{send(sym)}"
end

那么你可以使用a.as_string(:attributename) 得到你想要的结果吗?否则,您正在寻找一个充当对象的属性,而 attr_accessors 并不是真正要走的路..

旧答案:

您需要覆盖类定义中的to_s 方法。请注意,这是由puts 隐式调用的——当一个方法需要一个字符串时,它会自动尝试to_s,所以你不需要。

【讨论】:

  • 谢谢。我看到 attr_accessors 的使用确实受限于我的目的
  • “感谢比任何金钱奖励更有价值。”
【解决方案2】:

在 A 类中创建一个 to_s 方法。这应该覆盖默认值。

例如

class A
def initialize
end

def to_s
puts "Name for a: #{name}"
end

end

【讨论】:

  • 我想在属性名上调用 to_str,而不是在对象 a 上。这可能吗?
  • 在这种情况下最好创建自己的方法,以您喜欢的格式显示名称?
  • 你的意思是,除了用自定义 to_str 定义一个类名并将其包含到 A 中之外别无他法?
  • Name 指向一个字符串对象,该字符串对象属于一个带有 to_str(或 to_s)方法的字符串类——您可以在此处重写该方法,但这并不明智!
  • “感谢比任何金钱奖励更有价值。”