Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中,如何在类内编写代码,以便getter foo和setter self.foo=。。。看起来更相似?_Ruby - Fatal编程技术网

在Ruby中,如何在类内编写代码,以便getter foo和setter self.foo=。。。看起来更相似?

在Ruby中,如何在类内编写代码,以便getter foo和setter self.foo=。。。看起来更相似?,ruby,Ruby,在Ruby中,在类的实例方法中,我们使用getter by foo 我们使用一个setter self.foo = something 一个不需要有一个self.另一个需要,有没有办法让它们看起来更相似,而不使用类似self.foo的东西作为获取工具,因为它看起来也很冗长 (更新:注意getter和setter可能只是获取或设置一个实例变量,但它们也可能做很多工作,比如进入数据库检查记录是否存在,如果没有,则创建记录,等等)据我所知,Ruby中没有解决这一问题的方法。我很有信心Ruby就是这

在Ruby中,在类的实例方法中,我们使用getter by

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