【问题标题】:Instantiating defaults and variables实例化默认值和变量
【发布时间】:2014-11-12 03:06:45
【问题描述】:

所以我有一个班级 Ball。在 Ball 中,我们有一个方法类型。我想要做的是返回一个球类型的字符串。棘手的部分:如果球没有参数,我想返回字符串“标准”。这可以很好地处理无参数情况。但是,“足球”案例不断抛出 ArgumentError 1 for 0 错误。如果没有传递给类型的参数并打印给定的参数(假设它是一个字符串),我想要做的是设置一个默认的“标准”。如何修复 ArgumentError?我已经尝试使用 splat 并且已经使用了 0 个参数。都没有用

class Ball
  def type(ball="standard")
      ball
    end
end

Test.assert_equals Ball.new("football").ball_type, "football"
Test.assert_equals Ball.new.ball_type, "standard"

【问题讨论】:

    标签: ruby class default argument-error


    【解决方案1】:

    由于您在Ball 上调用new,因此您应该将type 方法重命名为initialize。当构造Ball 的新实例时,将自动调用此方法。

    class Ball
      def initialize(ball = "standard")
        @ball = ball
      end
    end
    

    @ball = ball 表示ball 参数保存到@ball 实例变量中。

    当您调用Ball.new.ball_type 时,您似乎还想要一个访问球类型的方法:

    class Ball
      def initialize ... end
    
      def ball_type
        @ball
      end
    end
    

    此方法仅返回 @ball 实例变量的值,该变量在 initialize 方法中设置。

    经过这些修改:

    Ball.new("football").ball_type # => "football"
    Ball.new.ball_type # => "standard"
    

    【讨论】:

    • 这样就成功了,但是有什么办法可以折射它吗?有 2 种方法来处理 null 案例只是感觉..对我来说效率低下
    • @user3466773 这很简单。如果您不介意将 ball_type 方法重命名为 ball,则可以将 def ball_type ... end 重构为 attr_accessor :ball。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2016-06-17
    • 2014-03-23
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多