【问题标题】:Ruby can an instance variable be printed instead of the instance address?Ruby可以打印实例变量而不是实例地址吗?
【发布时间】:2015-08-01 04:36:54
【问题描述】:

我最近在 ruby​​ 中进行实验,遇到了一个障碍。我想将一个类实例推送到一个数组,而不是在打印数组元素时输出: [#]

我希望它输出:

[“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

谢谢

【问题讨论】:

  • 当你调用puts时,你是在隐式调用对象的to_s方法。默认情况下,它会打印实例的地址。 Steffen 的回答会为您解决问题。

标签: arrays ruby class instance instance-variables


【解决方案1】:

只需像这样覆盖to_s 方法:

def to_s
  wName
end

【讨论】:

  • 工作就像一个魅力,很高兴知道演员可以超载。
【解决方案2】:
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"]

【讨论】:

    【解决方案3】:

    如果您想通过使用单个puts 来获得类似["M16"] 的输出,我会使用Array.map 方法,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2015-02-08
      • 2010-10-28
      • 2014-09-21
      • 2013-04-27
      • 2021-08-27
      • 2017-04-11
      • 1970-01-01
      • 2015-07-07
      相关资源
      最近更新 更多