【问题标题】:Ruby Beginner: Can't Get Created Methods To WorkRuby 初学者:无法创建工作方法
【发布时间】:2014-11-08 19:18:20
【问题描述】:

使用

  • Ruby 2.1.4
  • Mac OSX 10.9.5
  • 文本管理员
  • 终端

解决这个问题: “创建一个名为 Car 的类。给它一个名为 new_car 的方法,该方法将返回一个空数组。(这个数组象征着一辆正在工厂中建造的新车。)然后,创建一个方法,获取由 blank_array 返回的空数组方法并将一些重要的汽车部件添加到该数组中,并返回新数组。然后,创建一个采用该新数组的方法,并向其添加其他内容,等等。这样做直到您总共有五个方法。所以到最后,你应该有一个方法最终会返回一个包含四个汽车零件的数组。(如:[“engine”,“wheels”,“radio”,“cupholder”])“

所以我创建了一个类并在其中添加了一些方法,这样我就可以“建造”一辆汽车。我将类加载到 irb 中,并通过编写 newcar = Car.new 创建了一个名为 newcar 的变量。当我输入 newcar.new_car 时,ruby 返回空数组。但是,当我调用任何其他方法时,我会收到错误消息:

NameError: undefined local variable or methodcar' 代表# 来自 car.rb:9:in add_wheels' from (irb):5 from /UserName.rvm/rubies/ruby-2.1.4/bin/irb:11:in'`

class Car

  def new_car
    car = []
    return car
  end

  def add_wheels
    car << "wheels"
    return car
  end

  def add_axels
    car << "axels"
    return car
  end

  def add_engine
    car << "engine"
    return car
  end

  def add_radio
    car << "radio"
    return car
  end
end

感谢任何帮助!

【问题讨论】:

    标签: ruby methods


    【解决方案1】:

    我希望您编写的代码是用于学习目的。因为它的任何一点对我来说都没有任何意义。

    您遇到的错误是因为您在 new_car 方法中定义的 car 数组是本地的,并且不适用于其他实例方法。为此,您需要使用attr_accessor 使car 可用作实例方法,可用于读取和写入实例变量,如下所示:

    class Car
    
      attr_accessor :car
    
      def new_car
        @car = []
      end
    
      def add_wheels
        car << "wheels"
        return car
      end
    
      def add_axels
        car << "axels"
        return car
      end
    
      def add_engine
        car << "engine"
        return car
      end
    
      def add_radio
        car << "radio"
        return car
      end
    end
    
    newcar = Car.new
    
    newcar.new_car
    puts newcar.add_wheels
    #=> 'wheels'
    

    注意@car = []new_car 方法中。这将实例变量@car定义为一个空数组,可以在后面的代码中通过读取器方法car和写入器方法car&lt;&lt;car=访问。

    另外,像@car = [] 这样初始化实例变量是initialize 方法的好地方,而不是new_car

    def initialize
      @car = []
    end
    

    所以,当你调用Car.new时,它会调用initialize方法并且你的变量@car = []会被默认初始化。

    【讨论】:

    • 一件事。为什么你只在new_car 中使用@car 而在其他地方使用访问器?有什么具体原因吗?如果有,请在答案中说明。如果没有 - 提到没有 =) ...这可能是介绍 initialize 的好地方。
    • @D-side :我想你没有看底部的注释,我清楚地提到了为什么@carnew_car 中。当然有initialize方法就好了,OP更关心为什么错误是程序中方法car的未定义局部变量。
    • 我在询问之前阅读了它,这是 Ruby 中相当棘手的部分。我以为attr_accessor是定义修改对应实例变量的方法(:car代表@car,其实是真的),之后直接使用@car是没有意义的。我原以为只使用car = [] 会起作用(通过调用car=),但事实证明,它会创建一个局部变量。呵呵。
    • 使用attr_accessor 使@car 在类外可读可写,这可能是不可取的。说你“需要使用”也是不正确的。
    • 嗯...更正了解释。谢谢。
    【解决方案2】:

    您正在编写实例方法,因此您需要使用一个实例变量,以便它们都能访问同一个数组。只需将所有 car 变量替换为 @car

    class Car
      def new_car
        @car = []
      end
    
      def add_wheels
        @car << "wheels"
      end
      # etc...
    

    【讨论】:

    • 第一个 op 没有定义任何实例方法,第二个即使 op 决定定义一个实例变量,调用car &lt;&lt; 也不起作用。最后,您必须制作自己的 writer 方法或至少使用 attr_writer。第三,作为一个红宝石初学者,除非你举一个例子来解释事情,否则你不会明白你想说什么。第四,没有例子,答案和评论一样好。
    • 为了更清楚,当我说:没有定义任何实例方法。我的意思是carcar&lt;&lt;
    • 首先,他在定义实例方法:def add_wheels定义了一个实例方法等。我说用@car替换everycar@car &lt;&lt;,这会奏效。您没有必须使用attr_writerattr_accessor 来修改类中的实例变量。您可以直接访问该变量。
    • 另外请解释一下我的回答在技术上不正确的地方。
    • 2.您应该解释为什么代码不起作用,以及它如何通过轻微的修改(当然,如果可能的话)而不是把它们扔给不同的方法(只有在呈现的代码/方法完全错误时才应该给出或无法修复)。这给了提问者一个想法: A:可能教程/项目代码是错误的。 B:可能是为了使这种方法发挥作用而做了一些额外的工作。这让提问者产生了一个疑问:为什么我的代码不起作用,而我看到的其他代码却在起作用?.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多