【问题标题】:Ruby - chaining methods and returning arrayRuby - 链接方法和返回数组
【发布时间】:2010-08-05 02:16:36
【问题描述】:

我有一些方法用于返回像["1", "3", "2", "6", "2"] 这样的数组的类。可以,这些是字符串数组,而不是数字。我有另一种方法,它接受一个数组,并将其转换为像 1 3 2 6 2 这样的单个字符串。

class Turn
  def initialize
    @rolls = 1
    @dice = []
  end

  def roll
    @roll = []
    x = 5 - @dice.length
    x.times do |i|
      @roll[i] = rand(6) + 1
    end
    @roll  # ["1", "3", "2", "6", "2"]
  end

  def show
    @dice  # ["1", "3", "6"]
  end

  def line(something)
    temp = ""
    something.each do |x|
      temp << x + " "
    end
    puts temp   # "1 3 6 " or "1 3 2 6 2 "
  end
end

然后我希望能够将方法链接在一起,这样我就可以做到了

first = Turn.new
first.roll.line
first.show.line

但是,我真的不知道如何做到这一点,而且我一直无法在网上找到如何做到这一点。我已经看到self 被退回,但我无法真正弄清楚它的作用。 line 方法中的代码如果我将它移到另一个方法中就可以工作,所以问题实际上只是处理链接和返回。

如果有人不仅可以帮助编写代码,还可以帮助了解链接在返回值方面的工作方式以及返回自我的工作方式,那就太棒了。

谢谢!

【问题讨论】:

    标签: ruby methods method-chaining


    【解决方案1】:

    由于您的 #roll#show 方法返回一个数组,您需要定义一个方法 Array#line 才能真正执行 first.roll.line

    顺便说一句,已经有Array#join 将数组元素连接到一个字符串中,就像你的#line 方法一样,所以你也可以使用first.roll.join(' ') 并摆脱你的#line 方法。

    【讨论】:

    • 你的第二部分很完美!也感谢您解释第一部分。所以当我从左到右阅读时,每个方法都会返回一个值,由下一个方法执行?
    • 是的,每个方法都会返回最后一个参数。看到这一点的一个好方法是使用 irb 控制台。
    • @Jed 您是指返回方法中的最后一个参数,因此您不需要显式拥有return @dice 吗?因为我已经明白了。我想知道当您将多个方法链接在一起时,它们如何传递返回的值。
    • 您可以认为first.roll.join(' ') 等同于tmp = first.roll,后跟tmp.join(' ')。首先是一个包含对象的变量(Turn 类的一个实例)。 first.roll 对该对象调用#roll 方法,该方法返回一个数组(一个对象,它是类Array 的一个实例)。在这个数组上,调用方法#join,它返回一个字符串(String 类的一个实例)。所以是的,如果你像这样链接方法调用,每个“步骤”都会在前一个“步骤”的返回事物上调用一个实例方法。
    • @Andreas 谢谢安德烈亚斯,这就是我想知道的。我添加了一些更复杂的链接,一切都很好。
    猜你喜欢
    • 2011-03-23
    • 2014-10-18
    • 2014-08-12
    • 2015-07-02
    • 2019-11-26
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多