Ruby 可以打印实例变量而不是实例地址吗?

Ruby can an instance variable be printed instead of the instance address?

我最近在 ruby 中进行试验,遇到了一个障碍。我想将一个 class 实例推送到一个数组,而不是在打印数组元素时输出它: [#< WeaponItem:0x00000002a28058 @wName="M16A1", @mP=5, @mxP=35 >]

我希望它输出:

["M16A1"]

但是符号和实例变量(self.variable、self.class.variable)没有达到预期的效果,我无法敲定正确的方法,所以我想知道这是否可行努力。

代码:

class WeaponItem  
  attr_reader :wName  
  def initialize(wName,mPower,mxPower)    
    @wName = wName
    @mP = mPower
    @mxP = mxPower
  end

  def getStats
    puts "Weapon"
    puts "Name: #{@wName}"
    puts "Damage: #{@mP}~#{@mxP}"
  end

  def calculateDamage()
    rMAX = @mxP/@mP
    rMAX
  end  
end

vA = Array.new(3){0}
wP = WeaponItem.new("M16A1", 5, 15)
vA.push(wP)
print vA

谢谢

只需像这样覆盖 to_s 方法:

def to_s
  wName
end

如果你想通过使用单个 puts 获得像 ["M16"] 这样的输出,我会使用 Array.map 方法,如下所示:

namesArray = vA.map do |weapon|
  weapon.wName
end

puts namesArray
class WeaponItem  
  attr_reader :wName  
  def initialize(wName,mPower,mxPower)    
    @wName = wName
    @mP = mPower
    @mxP = mxPower
  end

  def getStats
    puts "Weapon"
    puts "Name: #{@wName}"
    puts "Damage: #{@mP}~#{@mxP}"
  end

  def calculateDamage()
    rMAX = @mxP/@mP
    rMAX
  end 
end

vA = Array.new
wP = WeaponItem.new("M16A1", 5, 15)
vA.push(wP.wName)
print vA
#=> ["M16A1"]