在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中做这种事情的普遍接受的方式。如果不是,那么是什么?
答案 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。