【问题标题】:In ruby, should I use instance variables or direct method calls在 ruby​​ 中,我应该使用实例变量还是直接方法调用
【发布时间】:2015-12-03 08:12:43
【问题描述】:

我正在编写一个涉及多种方法的类,用于特定目的。 但是,每个方法的最终结果都保存在一个实例变量中,以便其他方法可以访问它们。 然而,在 ruby​​ 中,方法调用返回最后一个值,也可以采用这种方法。但是我很困惑哪种方法在编程上是正确的并且更像红宝石。

我的代码示例如下

Approach1:- 方法调用

class Foo
  def cat
    "This is a cat"
  end
  def bigcat
     cat
  end
end
mycat = Foo.new
mycat.cat
mycat.bigcat
Output:- This is a cat
         This is a cat

方法2:- 实例变量

class Foo
  def cat
    @cat_talk = "This is a cat"
  end
  def bigcat
     @cat_talk
  end
end
mycat = Foo.new
mycat.cat
mycat.bigcat



Output:- This is a cat
         This is a cat

上面的例子可能看起来很简单,但在我的 ruby​​ 类中,实现要复杂得多,而且规模更大。

【问题讨论】:

    标签: ruby variables methods


    【解决方案1】:

    您可以重命名实例变量并使用访问器方法,而不是定义方法 bigcat

    基于dimitris answer的示例:

    class Foo
      def cat
        @bigcat ||= "This is a cat"
      end
      attr_reader :bigcat
    end
    
    mycat = Foo.new
    mycat.cat
    mycat.bigcat
    

    如果你想保留你的变量名,你可以把它和alias结合起来:

    class Foo
      def cat
        @cat_talk ||= "This is a cat"
      end
      attr_reader :cat_talk
      alias :bigcat :cat_talk
    end
    
    mycat = Foo.new
    mycat.cat
    mycat.cat_talk
    mycat.bigcat
    

    除了您的问题,仅供参考:您还可以使用attr_writer 定义一个写入器方法。

    【讨论】:

    • 老实说,我认为tat,但我认为其目的不是“包裹”bigcat,而是同时做其他事情。在这两种情况下,attr 阅读器都是一个不错的补充
    【解决方案2】:

    我建议这样(记忆):

    class Foo
      def cat
        @cat_talk ||= "This is a cat"
      end
      def bigcat
         cat
      end
    end
    
    mycat = Foo.new
    mycat.cat
    mycat.bigcat
    
    Output:- This is a cat
             This is a cat
    

    通常恕我直言,最好在包装变量时调用方法,而不是直接访问它们。例如,如果您想将其大写,您可以将cat 包装起来,并保持实际数据不变。

    【讨论】:

    • 感谢您的提示先生.. 记忆 == 缓存吗?
    • 为了讨论的目的,是的,en.wikipedia.org/wiki/Memoization。本质上,您不想在每次调用时都分配。
    猜你喜欢
    • 2015-11-25
    • 2011-04-14
    • 2023-03-22
    • 2012-07-24
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多