对“自我”的使用感到非常困惑; 'parameter.method'

时间:2019-08-09 20:36:57

标签: ruby

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

  1. 为什么会“放10.miles.back”?由于该行位于Numeric类之外,因此它不应该是“ puts Numeric.10.miles.back”吗?

  2. 我已经读到“ self”是指包含的类。那么,它在这里看起来像是一个数字呢?

  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

1 个答案:

答案 0 :(得分:3)

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

  1. 否。 10Numeric的实例,因此刚刚添加了所有公共方法,包括miles方法。 10.miles调用您刚刚添加的miles的{​​{1}}方法。

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

  3. 第一种方法中没有"a,b,c",但是如果您是指self *中的self *,那么它只是乘法。请记住,这些方法中的def miles是一个数字。因此self的结果为10.miles,该结果返回一个代表10英里的数字。

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

10 * 5280.feet
  1. class Numeric def miles(arg) puts "got an arg #{arg}" self * 5280.feet end end 10.miles("some argument") 是调用(或调用)方法的一种方式。 number.method之所以有效,是因为您在数字10.miles.back上调用了miles方法,该方法返回了另一个数字。然后,您可以在该号码上调用10方法。