2014-09-20 94 views
0

在JavaScript中,要创建一个类,我可以创建一个构造函数或工厂来创建对象。允许更改属性的类

​​

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

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

+1

这是正确的方法(除attr_reader和attr_writer可以用attr_accessor代替外)。是什么让你怀疑它不是? – sawa 2014-09-20 17:59:31

+0

使用'attr_accessor'而不是attr_reader/attr_writer对 – 2014-09-20 17:59:46

+0

@sawa我读了一些其他使用getter方法的代码。我知道语言在做同样的事情方面有不同的方式,社区倾向于某些约定。在Ruby中for循环vs每个语句都是一个例子....所以我读过了。 :/谢谢 – William 2014-09-20 18:04:06

回答

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" 
+0

或者,甚至更简单,我会使用散列。 – sawa 2014-09-20 18:07:41

+1

@sawa:哈希看起来不像prettily :) – 2014-09-20 18:23:22

0

你会用什么课程?仅用于存储数据吗?还是为了添加行为?

如果它仅用于存储数据,然后使用结构:

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。