首页 > 解决方案 > 对“自我”的这种使用感到非常困惑;'参数.方法'

问题描述

代码如下;这是教科书中的一个例子。问题:

  1. 为什么它会“退回 10.miles.back”?由于该行不在 Numeric 类之外,不应该是“puts Numeric.10.miles.back”吗?

  2. 我读过“自我”指的是包含类。那么它是如何在这里充当一个数字的呢?

  3. 如果我从第一个调用的方法中删除“self *”,代码似乎仍然工作完全相同。那么它在那里做什么呢?

  4. 我似乎无法将这些方法中的任何一个转换为接受参数的普通方法。它输出错误报告该方法未定义。

  5. 我猜 number.method 是一种传递参数的方式。这种语法叫什么?

class Numeric
  def inches
    self
  end

  def feet
    self * 12.inches
  end

  def yards
    self * 3.feet
  end

  def miles
    self * 5280.feet
  end

  def back
    self * -1
  end

  def forward
    self
  end
end

puts 10.miles.back

标签: ruby

解决方案


在 ruby​​ 中,基本上一切都是类的实例。在这种情况下,数字文字是Numeric. 此代码重新打开该类并向其添加方法。这为您的程序中的所有数字提供了这些方法。

  1. No.10是 的一个实例Numeric,因此具有刚刚添加的所有公共方法,包括一个miles方法。10.miles调用刚刚添加的 的miles方法。10

  2. “我读过‘self’指的是包含类。” 那不准确。self指的是正在执行其方法的对象。当您调用"a,b,c".split(',')时,它将调用split字符串对象上的方法,并且在该方法内部self将引用字符串"a,b,c"

  3. self *第一种方法中没有,但如果你的意思是self *in def miles,那么它只是乘法。请记住,self在这些方法中是一个数字。所以10.miles结果是10 * 5280.feet,它返回一个代表 10 英里的数字。

  4. 添加一个参数应该可以正常工作,只要您在调用它时提供一个参数:

class Numeric
  def miles(arg)
    puts "got an arg #{arg}"
    self * 5280.feet
  end
end

10.miles("some argument")
  1. number.method是调用(或调用)方法的一种方式。10.miles.back有效,因为您在 number 上调用该miles方法,该方法10返回一个不同的数字。然后你调用back那个号码的方法。

推荐阅读