Javascript 允许更改属性的类

Javascript 允许更改属性的类,javascript,ruby,Javascript,Ruby,在JavaScript中,要创建一个类,我要么创建一个构造函数,要么创建一个工厂来创建对象 function Person(name){ this.name = name; } var willy = new Person("William"); 这样我就可以访问这个对象的属性 willy.name // "William" 我也可以改变它 willy.name = "Bill" 在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中做这类事情的普遍接受的方式。如果不是,那么是什么?

如果这些对象只是一堆属性,那么有一个名为
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"
class Person“比尔”
威利,姓,达西

如果这些对象只是属性包,那么有一个名为
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"
class Person“比尔”
威利,姓,达西

如果这些对象只是属性包,那么有一个名为
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"
class Person“比尔”
威利,姓,达西

如果这些对象只是属性包,那么有一个名为
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"
class Person“比尔”
威利,姓,达西

您将如何使用您的课程?它是否仅用于存储数据?还是为了增加行为

如果仅用于存储数据,请使用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'
如果希望向simple 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。

您将使用类做什么?它是否仅用于存储数据?还是为了增加行为

如果仅用于存储数据,请使用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'
如果希望向simple 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。

您将使用类做什么?它是否仅用于存储数据?还是为了增加行为

如果仅用于存储数据,请使用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'
如果希望向simple 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。

您将使用类做什么?它是否仅用于存储数据?还是为了增加行为

如果仅用于存储数据,请使用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'
如果希望向simple 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。

这是正确的方法(除了
attr\u reader
attr\u writer
可以替换为
attr\u accessor
)。是什么让你怀疑它不是?请使用
attr\u访问器
而不是attr\u reader/attr\u writer pairI-see。因此,这是一个指向同一目的的简短方法。@sawa显然倾向于使用attr_访问器,而不是我不知道的显式getter方法。:)@TaoistWA:attr_访问器优于显式读写器对。如果您只需要一个读卡器,请使用attr\u reader。这是正确的方法(除了
attr\u reader
attr\u writer
可以替换为
attr\u accessor
)。是什么让你怀疑它不是?请使用
attr\u访问器
而不是attr\u reader/attr\u writer pairI-see。因此,这是一个指向同一目的的简短方法。@sawa显然倾向于使用attr_访问器,而不是我不知道的显式getter方法。:)@TaoistWA:attr_访问器优于显式读写器对。如果您只需要一个读卡器,请使用attr\u reader。这是正确的方法(除了
attr\u reader
attr\u writer
可以替换为
attr\u accessor
)。是什么让你怀疑它不是?请使用
attr\u访问器
而不是attr\u reader/attr\u writer pairI-see。因此,这是一个指向同一目的的简短方法。@sawa显然倾向于使用attr_访问器,而不是我不知道的显式getter方法。:)@TaoistWA:attr_访问器优于显式读写器对。如果您只需要一个读卡器,请使用attr\u reader。这是正确的方法(除了
attr\u reader
attr\u writer
可以替换为
attr\u accessor
)。是什么让你怀疑它不是?请使用
attr\u访问器
而不是attr\u reader/attr\u writer pairI-see。因此,这是一个指向同一目的的简短方法。@sawa显然倾向于使用attr_访问器,而不是我不知道的显式getter方法。:)@TaoistWA:attr_访问器优于显式读写器对。如果您只需要一个读卡器,请使用attr_reader。或者,更简单的是,我会使用哈希。@sawa:hash看起来没有prettiliy:)或者,更简单的是,我会使用哈希。@sawa:hash看起来没有prettility: