【问题标题】:Ruby using self in accessor method causes SystemStackErrorRuby 在访问器方法中使用 self 会导致 SystemStackError
【发布时间】:2016-12-30 21:35:01
【问题描述】:

我不明白,当我尝试运行以下代码时,我得到了

employee.rb:55:in `hourly_wage=':堆栈级别太深 (SystemStackError)

class HourlyEmployee < Employee
    attr_reader :hourly_wage, :hours_per_week

    def hourly_wage=(hourly_wage)
        self.hourly_wage = hourly_wage
    end

    def hours_per_week=(hours_per_week)
        self.hours_per_week = hours_per_week
    end

    def print_pay_stub
        print_name
        pay_for_period = (hourly_wage) * (hours_per_week) * 2
        formatted_pay = format("$%.2f", pay_for_period)
        puts "Pay for this period: #{formatted_pay}"
    end
end

在 Java 中我在 setter 方法中使用 this 关键字,这不是基本相同吗?

如果我将 def 替换为,那么一切正常。

def hourly_wage=(hourly_wage)
        @hourly_wage = hourly_wage
    end

抱歉,刚开始学Ruby

【问题讨论】:

  • 在您的情况下,您不需要实现def hourly_wage=def hours_per_week=。您可以简单地将attr_reader :hourly_wage, :hours_per_week 更改为attr_accessor :hourly_wage, :hours_per_week
  • @sig 抱歉..忘了提到那里会有验证..为了清楚起见,我只是将其删除。

标签: ruby


【解决方案1】:

你可以想象hourly_wage=是一个方法名

你的代码:

def hourly_wage=(hourly_wage)
  self.hourly_wage = hourly_wage
end

如果您将名称 hourly_wage= 替换为 assign,它将变为:

def assign(hourly_wage)
  self.assign(hourly_wage)
end

你在没有断点的情况下递归调用自己,所以它会引发 stack level too deep 异常。

【讨论】:

  • "你可以想象hourly_wage=是一个方法名"——不需要想象。 hourly_wage= 是一个方法,就像任何其他方法一样。
  • 是的,但是对于帮助新的 ruby​​ 用户了解 lang 的工作原理很有帮助,考虑到用户来自 java,所以语法上有很多他不知道的变化。我认为这样解释没有任何问题
【解决方案2】:

您在hourly_wage= 中递归调用hourly_wage=,没有终止条件,因此您无限递归。由于 Ruby 没有适当的尾递归,因此您有时会耗尽堆栈空间。

在 Java 中我在 setter 方法中使用 this 关键字,这不是基本相同吗?

是的,它与这个等效的 Java 代码完全相同:

void setHourlyWage(BigDecimal hourlyWage) {
  this.setHourlyWage(hourlyWage);
}

这将产生完全相同的结果:堆栈溢出。

如果我将 def 替换为,那么一切正常。

def hourly_wage=(hourly_wage)
  @hourly_wage = hourly_wage
end

这是完全不同的东西。在这里,您不是递归调用hourly_wage=,而是简单地分配给一个实例变量(Java 术语中的“字段”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多