允许更改属性的类

时间:2014-09-20 17:50:34

标签: javascript ruby

在JavaScript中,要创建一个类,我要么创建一个构造函数或工厂来创建对象。

function Person(name){
  this.name = name;
}

var willy = new Person("William");

然后我可以这样访问该对象的属性

willy.name // "William"

我也可以改变它

willy.name = "Bill"

在Ruby中,创建一个我可以动态访问和更改属性的类是最常被接受的约定(如果有这样的事情)?我发现了这个:

class Person
  attr_reader :name  
  attr_writer :name  
  def initialize(name)
    @name = name
  end  
end

willy = Person.new("William")
willy.name = "Bill"

我想知道这是否是在Ruby中做这种事情的普遍接受的方式。如果不是,那么是什么?

2 个答案:

答案 0 :(得分:3)

如果这些对象只是属性包,则会有一个名为Struct的快捷方式。

class Person < Struct.new(:name, :last_name)
end
# or simpler
# Person = Struct.new(:name, :last_name)

willy = Person.new("William", "Darcy")
willy.name = "Bill"
willy.name # => "Bill"
willy.last_name # => "Darcy"

答案 1 :(得分:0)

你会用什么课程?它只用于存储数据吗?或者也可以添加行为?

如果仅用于存储数据,请使用Struct:

Person = Struct.new(:name)

这与输入相同:

class Person
  attr_accessor :name #attr_accessor is attr_reader + attr_writer
  def initialize(name=nil)
    @name = name
  end
end

所以,继续我们的例子:

 Person = Struct.new(:name)
 a_person= Person.new
 a_person.name #nil
 a_person.name = 'Mike'
 a_person.name #=> 'Mike'
 a_second_person = Person.new('John')
 a_second_person.name #=> 'John'
 a_second_person.name = 'Maria'
 a_second_person.name #=> 'Maria'

如果您想为简单的Person Struct类添加更多方法,可以执行以下操作:

Person = Struct.new(:name) do
  def reversed_name
    name.reverse
  end
end
a_person= Person.new('Hillary')
p a_person.reversed_name #=> "yralliH"

但如果您已经决定为您的课程添加一堆行为,那么最好使用与您的示例相似的正常声明,而不是使用Struct。