在Ruby中,如何在类内编写代码,以便getter foo和setter self.foo=。。。看起来更相似?
在Ruby中,在类的实例方法中,我们使用getter by在Ruby中,如何在类内编写代码,以便getter foo和setter self.foo=。。。看起来更相似?,ruby,Ruby,在Ruby中,在类的实例方法中,我们使用getter by foo 我们使用一个setter self.foo = something 一个不需要有一个self.另一个需要,有没有办法让它们看起来更相似,而不使用类似self.foo的东西作为获取工具,因为它看起来也很冗长 (更新:注意getter和setter可能只是获取或设置一个实例变量,但它们也可能做很多工作,比如进入数据库检查记录是否存在,如果没有,则创建记录,等等)据我所知,Ruby中没有解决这一问题的方法。我很有信心Ruby就是这
foo
我们使用一个setter
self.foo = something
一个不需要有一个self.
另一个需要,有没有办法让它们看起来更相似,而不使用类似self.foo的东西作为获取工具,因为它看起来也很冗长
(更新:注意getter和setter可能只是获取或设置一个实例变量,但它们也可能做很多工作,比如进入数据库检查记录是否存在,如果没有,则创建记录,等等)据我所知,Ruby中没有解决这一问题的方法。我很有信心Ruby就是这样计算表达式的
当给定一个值时,Ruby将首先检查上下文中是否有与所调用的局部变量相匹配的局部变量。如果存在(在您的案例中可能是“foo”),则将使用该值。如果没有这样的值,那么Ruby将尝试以方法调用的形式查找该值(以“self”作为调用方)。如果查找路径中不存在这样的方法,则会引发错误
在setter中使用“self”是为了避免Ruby将值设置为局部变量,而只有在getter实例中没有使用同名局部变量时,才需要使用“self”。为了避免混淆价值观的来源,明确地使用自我可能会更好、更清晰,尽管要稍微详细一些 由于局部作用域优先,当您说foo=something
时,将创建一个局部变量foo
,并将something
的内容分配给它
为了使用getter,您可以编写foo
,这是因为当Ruby找不到具有该名称的变量时,它会在作用域中向上移动,并最终找到该方法
如果存在与getter方法同名的局部变量,Ruby将使用其值:
class Foo
attr_accessor :foo
def initialize
@foo = :one
end
def f
foo = :two
foo
end
end
Foo.new.f
# => :two
为了明确您想要访问setter,您必须编写self.foo=something
。这将告诉Ruby您想要在self
对象上执行foo=
方法,并将something
作为参数。如果您愿意打破惯例,您可以使用jQuery风格编写setter,对getter和setter使用相同的方法,这取决于它是否有参数:
def foo *args
return @foo if args.empty?
@foo = args.first
end
# => nil
foo
# => nil
foo(:bar) # foo = :bar
# => :bar
foo
# => :bar