我的任务是为编码挑战创建一个无与伦比的井字游戏对手,我想为此创建一个 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/