在我的控制器中,我有以下简化代码:
def index
@dashboard_items = []
DashItem = Struct.new(:name, :amount, :moderated) # Error is here
[:page, :post].each do |c|
obj = c.to_s.capitalize.constantize
@dashboard_items << DashItem.new(c.to_s, obj.count, obj.count_moderated)
end
end
Run Code Online (Sandbox Code Playgroud)
但是Ruby给出了以下错误:
动态常量赋值(SyntaxError)
在上面标出的线上.
其中,AFAIK,意味着DashItem已经定义了常量.它是否正确?该怎么办呢?
在ruby中,我经常发现自己编写以下内容:
class Foo
def initialize(bar, baz)
@bar = bar
@baz = baz
end
<< more stuff >>
end
Run Code Online (Sandbox Code Playgroud)
甚至
class Foo
attr_accessor :bar, :baz
def initialize(bar, baz)
@bar = bar
@baz = baz
end
<< more stuff >>
end
Run Code Online (Sandbox Code Playgroud)
我总是希望尽可能地减少样板 - 所以有没有更惯用的方式在ruby中创建对象?
我正在关注Codecademy的Ruby课程,大约85%完成了.
一遍又一遍地要求你创建一个类并传入一些参数并使它们成为实例变量,例如:
class Computer
def initialize(username, password)
@username = username
@password = password
end
end
Run Code Online (Sandbox Code Playgroud)
每次,它都会要求您生成与传入的参数完全相同的实例变量.
它让我想知道是否有一种Ruby方法可以自动处理这种情况,无需每次都自己输入.
我知道你可以做到
class Computer
def initialize(username, password)
@username, @password = username, password
end
end
Run Code Online (Sandbox Code Playgroud)
但那打字几乎不算少.
我做了一些搜索,发现你可以使用attr_readerlike 创建一组'getters'
class Song
attr_reader :name, :artist, :duration
end
aSong = Song.new("Bicylops", "Fleck", 260)
aSong.artist # "Fleck"
aSong.name # "Bicylops"
aSong.duration # 260
Run Code Online (Sandbox Code Playgroud)
但据我所知,这并不是我想要的.我不是想自动创建getter和/或setter.我正在寻找的是这样的
class Person
def initialize(name, age, address, dob) #etc
# assign all passed in parameters to equally named instance variables
# for example
assign_all_parameters_to_instance …Run Code Online (Sandbox Code Playgroud)