我的任务是为编码挑战创建一个无与伦比的战术脚趾对手,我想为此创建一个Ruby宝石,它具有适当的测试覆盖率和体面的面向对象设计(OOD)。
我以前从来没有做过自己的创业板,作为一个新的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那么,用第一种方式比第二种方式做这件事的理由是什么?
编辑
好吧,我现在觉得有点傻了,看得更近一点,上面写着
class封装在一个TicTacToe模块中,以遵循Ruby的约定,并在其他项目中包含gem时防止>类名冲突。如果单元格初始化>没有任何参数,则单元格的值将是空字符串,但也可以使用参数>初始化单元格。单元格实例化后,其值无法更新。
然而,我仍然对最后一句感到困惑,“在实例化一个单元格之后,它的值无法更新。”
在本例中,我认为这是不正确的,据我理解,attr_accessor方法使值既可读又可写--因为它是可写的,所以我不能通过以下方式更新它
move = Cell.new
move.value = X 发布于 2014-11-14 17:45:12
第一例:
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代码会打印你好。
使用上面相同的代码,但将最后两行更改为
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这将再次输出空字符串。但是,如果我们尝试将最后2行更改为:
c = TicTacToe::Cell.new("hello")
puts c.value我们得到一个错误,因为初始化器不需要参数。因此,除了空字符串之外,我们不能用任何@值实例化它。
有关您的编辑:
是的,你仍然可以改变“值”。如果您希望防止这种情况发生,请只通过更改
attr_accessor :value至
attr_reader :value发布于 2014-11-14 17:35:55
实际上,这个站点在解释这两种方法的优缺点方面做得相当好:http://www.rubyist.net/~slagell/ruby/objinitialization.html
对于第一个示例,将'value‘作为"“作为参数传递,允许您重写此默认值,而您的第二个示例则强制'@value’变量始终”为“,而不管条件的变化如何。
如果这有帮助的话请告诉我。
https://stackoverflow.com/questions/26935642
复制相似问题