ruby - 在 Ruby 中,使用 "def initialize ( value = ' ') 初始化类实例有什么好处?

标签 ruby class oop

我的任务是为编码挑战创建一个无与伦比的井字游戏对手,我想为此创建一个 Ruby gem,它具有适当的测试覆盖率和体面的面向对象设计 (OOD)。

我以前从未制作过自己的 gem,并且是正确的 OOD 原则的新学生,我发现了一篇很好的博客文章,它完全介绍了我需要的内容:http://codequizzes.wordpress.com/2013/10/25/creating-a-tic-tac-toe-game-with-ruby/

在定义Cell类时,举例如下代码:

module TicTacToe
  class Cell
    attr_accessor :value

    def initialize (value = "")
      @value = value
    end 

  end
end

不过,在我看来,鉴于这种初始化的简单性,我们可以很容易地做到这一点:

module TicTacToe
  class Cell
    attr_accessor :value

    def initialize
      @value = ""
    end 

  end
end

那么,第一种方式优于第二种方式的理由是什么?

编辑

好吧,我现在觉得有点傻;仔细阅读博客文章,它清楚地说

The Cell class is wrapped in a TicTacToe module to follow Ruby gem conventions and prevent >class name collisions when gems are included in other projects. If Cell is initialized >without any arguments, the cell’s value will be the empty string, but Cell can also be >initialized with an argument. After a cell is instantiated, its value cannot be updated.

不过,我还是对最后一句“cell实例化后,它的值无法更新”感到困惑。

我认为在这个例子中这是不正确的,根据我的理解,attr_accessor 方法使值既可读又可写——因为它是可写的,我不能通过说<来更新它吗/p>

move = Cell.new
move.value = X 

最佳答案

第一种情况:

def initialize (value = "")
  @value = value
end

如果没有传递参数进行初始化,会将@value 设置为空字符串。如果将参数传递给初始化,则值将设置为该参数。

第二种情况:

def initialize
  @value = ""
end 

将始终将@value 设置为空字符串并且不接受参数。

例子:

如果我们有

module TicTacToe
  class Cell
    attr_accessor :value
    def initialize (value = "")
      @value = value
    end 
  end
end

c = TicTacToe::Cell.new("hello")
puts c.value

代码会打印 hello。

使用与上面相同的代码,但将最后两行更改为

c = TicTacToe::Cell.new
puts c.value    

代码不打印任何内容(除了空字符串)。

现在,如果我们将代码更改为第二种方式:

module TicTacToe
  class Cell
    attr_accessor :value
    def initialize
      @value = ""
    end 
  end
end

c = TicTacToe::Cell.new
puts c.value

这将再次输出空字符串。但是,这次如果我们尝试将最后两行更改为:

c = TicTacToe::Cell.new("hello")
puts c.value

我们得到一个错误,因为初始化器不期望一个参数。因此,除了空字符串之外,我们不能用任何@value 实例化它。

关于您的编辑:

是的,您仍然可以更改@value。如果您想阻止这种情况,请通过更改

使其仅可读
attr_accessor :value

attr_reader :value

关于ruby - 在 Ruby 中,使用 "def initialize ( value = ' ') 初始化类实例有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935642/

相关文章:

c# - 在不创建新类的情况下添加更多行为

ruby - RuboCop 在使用 'Hash.new' 时提示

python:pythonbrew 和 virtualenv 有什么区别?

ruby-on-rails - 如何在 Formtastic 中正确传递输入集合

JQuery 如果跨度值 = 0 改变颜色

database - 使用具体类或液体类作为属性

ruby - Ruby 中正则表达式后的字母

java - 将 List<MyObject> 转换为 List<MyInterface>

java - 使用Gradle脚本从Java文件创建WAR

java - toString() 方法没有继承自它的父类(super class)