首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ruby中,使用"def initializing ( value = '')“初始化类实例有什么好处?

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

Stack Overflow用户
提问于 2014-11-14 17:31:07
回答 2查看 369关注 0票数 1

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

我以前从来没有做过自己的创业板,作为一个新的OOD原则的学生,我发现了一篇很好的博客文章,它正是我所需要的:http://codequizzes.wordpress.com/2013/10/25/creating-a-tic-tac-toe-game-with-ruby/

在定义Cell类时,给出了以下代码作为示例:

代码语言:javascript
复制
module TicTacToe
  class Cell
    attr_accessor :value

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

  end
end

然而,在我看来,考虑到这种初始化的简单性,我们也可以很容易地做到这一点:

代码语言:javascript
复制
module TicTacToe
  class Cell
    attr_accessor :value

    def initialize
      @value = ""
    end 

  end
end

那么,用第一种方式比第二种方式做这件事的理由是什么?

编辑

好吧,我现在觉得有点傻了,看得更近一点,上面写着

class封装在一个TicTacToe模块中,以遵循Ruby的约定,并在其他项目中包含gem时防止>类名冲突。如果单元格初始化>没有任何参数,则单元格的值将是空字符串,但也可以使用参数>初始化单元格。单元格实例化后,其值无法更新。

然而,我仍然对最后一句感到困惑,“在实例化一个单元格之后,它的值无法更新。”

在本例中,我认为这是不正确的,据我理解,attr_accessor方法使值既可读又可写--因为它是可写的,所以我不能通过以下方式更新它

代码语言:javascript
复制
move = Cell.new
move.value = X 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-14 17:45:12

第一例:

代码语言:javascript
复制
def initialize (value = "")
  @value = value
end

如果没有传递参数来初始化,则将@value设置为空字符串。如果传递要初始化的参数,则将值设置为该参数。

第二个案件:

代码语言:javascript
复制
def initialize
  @value = ""
end 

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

示例:

如果我们有

代码语言:javascript
复制
module TicTacToe
  class Cell
    attr_accessor :value
    def initialize (value = "")
      @value = value
    end 
  end
end

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

代码会打印你好。

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

代码语言:javascript
复制
c = TicTacToe::Cell.new
puts c.value    

代码什么也不打印(除了空字符串外)。

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

代码语言:javascript
复制
module TicTacToe
  class Cell
    attr_accessor :value
    def initialize
      @value = ""
    end 
  end
end

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

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

代码语言:javascript
复制
c = TicTacToe::Cell.new("hello")
puts c.value

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

有关您的编辑:

是的,你仍然可以改变“值”。如果您希望防止这种情况发生,请只通过更改

代码语言:javascript
复制
attr_accessor :value

代码语言:javascript
复制
attr_reader :value
票数 3
EN

Stack Overflow用户

发布于 2014-11-14 17:35:55

实际上,这个站点在解释这两种方法的优缺点方面做得相当好:http://www.rubyist.net/~slagell/ruby/objinitialization.html

对于第一个示例,将'value‘作为"“作为参数传递,允许您重写此默认值,而您的第二个示例则强制'@value’变量始终”为“,而不管条件的变化如何。

如果这有帮助的话请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26935642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档