class Foo
attr_accessor :name, :age, :email, :gender, :height
def initalize params
@name = params[:name]
@age = params[:age]
@email = params[:email]
.
.
.
end
Run Code Online (Sandbox Code Playgroud)
这似乎是一种愚蠢的做法.在Ruby中初始化对象的更好/更惯用的方法是什么?
Ruby 1.9.3
我正在尝试理解以下Ruby代码.
它看起来像是attrs一个散列,它作为参数传递,默认值为空散列.
然后attrs.each迭代hash(|k,v|)中的键值对.
通过self.send在此迭代期间调用键值对的元素可以获得什么效果?
def initialize(attrs = {}, *args)
super(*args)
attrs.each do |k,v|
self.send "#{k}=", v
end
end
Run Code Online (Sandbox Code Playgroud) 可能重复:
在ruby中创建惯用对象
当我有一个如下所示的initialize方法时,有很多次:
class Foo
def initialize bar, buz, ...
@bar, @buz, ... = bar, buz, ...
end
end
Run Code Online (Sandbox Code Playgroud)
有没有办法用一个简单的命令来做到这一点,如:
class Foo
attr_constructor :bar, :buz, ...
end
Run Code Online (Sandbox Code Playgroud)
其中,符号表示实例变量的名称(与精神/风味attr_accessor,attr_reader,attr_writer)?
我想知道是否有内置方式或更优雅的方式做这样的事情:
class Class
def attr_constructor *vars
define_method("initialize") do |*vals|
vars.zip(vals){|var, val| instance_variable_set("@#{var}", val)}
end
end
end
Run Code Online (Sandbox Code Playgroud)
所以我可以像这样使用它:
class Foo
attr_constructor :foo, :bar, :buz
end
p Foo.new('a', 'b', 'c') # => #<Foo:0x93f3e4c @foo="a", @bar="b", @buz="c">
p Foo.new('a', 'b', 'c', 'd') # => #<Foo:0x93f3e4d @foo="a", @bar="b", …Run Code Online (Sandbox Code Playgroud) 现在是时候缩短它了:
class Foo
attr_accessor :a, :b, :c, :d, :e
def initialize(a, b, c, d, e)
@a = a
@b = b
@c = c
@d = d
@e = e
end
end
Run Code Online (Sandbox Code Playgroud)
我们有'attr_accessor'来生成getter和setter.
我们有什么要按属性生成初始值设定项吗?
我想知道是否有一种优雅的方法来使用ruby中的循环创建变量?
说我想把它放在某种循环中
def workhours
@monday = blah
@tuesday = brah
@wednesday = bro
@thursday = blap
@friday = blagh
end
Run Code Online (Sandbox Code Playgroud)
我希望能做什么
def workhour_ideally
days = [ "monday", "tuesday", "wednesday", "thursday", "friday" ]
days.each do |smack|
@"smack" = whatever
end
end
Run Code Online (Sandbox Code Playgroud)
红宝石可以吗?