任何人都可以解释为什么我们需要在我们的rails应用程序中使用attr_accessor(当我们真正需要它时的真实场景)?尽管它的存在是暂时的,但它对我们的应用程序有何帮助?
答案 0 :(得分:1)
好吧,既然如上所述你是一般的编程新手,这里有一个详细的,但目的只是简单的解释。
Ruby是遵循object oriented programming范例(OOP)的众多语言之一。因此,假设您正在开发一个系统来管理商店中的产品,并且您希望在代码中表示这些真实世界的产品。您可以使用class来实现此目标,其中包含您的真实世界产品可以执行的操作以及它具有的品质。我们假设您的产品是电视。
操作在OOP中使用methods定义。你能用电视做什么?您可以将其打开,转动,增大或减小音量并设置当前通道。
Television
|-> TurnOn
|-> TurnOff
|-> IncreaseVolume
|-> DecreaseVolume
|-> SetChannel
品质是在OOP中使用properties定义的,他们可以使您的每个表示形式(称为instances)都是唯一的。电视的一些特质是什么?其状态(ON或OFF),其当前通道和当前音量。下面是一组可能的电视属性。
Television
|-> State => ON
|-> Channel => 9
|-> Volume => 50
太棒了吧?所以你有一个电视类,它包含一些可以执行的操作和一些代表其当前状态的属性。现在让我们说你想要使用全新的电视。您需要知道它是否已经开启或关闭,它在哪个频道以及设置的音量。有几种语言以多种方式实现它,但让我们继续关注Ruby,不管吗?
ruby类可以通过三种方式公开其属性:accessors,readers和writers。使用访问者,您可以阅读和写值,您可以阅读的读者和写的作者。为什么这很重要呢?在OOP中你有encapsulation这个概念,你应该只暴露所需要的东西和所需的访问权限,以避免某人在一次操作中使你的电视当前音量从50跳到100,同时电视应该增加它或减少它1.所以你应该只以不影响它应该工作的方式(业务规则)的方式向你的类的消费者,属性和操作公开。
深入了解这些概念,你可能会更好地理解ruby访问器,它只是一种语法,可以通过类外部的读写权限来访问对象状态;)
答案 1 :(得分:0)
您 attr_accessor
。 attr_accessor
是一种便捷方法。它可以节省您的时间。如果你不在乎节省时间,那么就不要使用它。
我们来看看。
如果启动控制台并定义类
> class Foo
>
> end
并像这样创建一个新的Foo
:
> foo = Foo.new
=> #<Foo:0x00000008f2b9a0>
您会发现foo既不回复bar=
(setter
)也不回复bar
a getter
):
> foo.bar = :baz
NoMethodError: undefined method `bar=' for #<Foo:0x00000008f2b9a0>
> foo.bar
NoMethodError: undefined method `bar' for #<Foo:0x00000008f2b9a0>
或者,您可以像这样定义Foo
:
> class Foo
>
> def bar=(val)
> @bar = val
> end
>
> def bar
> @bar
> end
>
> end
> foo = Foo.new
=> #<Foo:0x00000004b6dec0>
> foo.bar = :baz
=> :baz
> foo.bar
=> :baz
在这种情况下,foo
现在响应bar=
和bar
。
或者,您可以这样做:
> class Foo
> attr_accessor :bar
>
> end
> foo = Foo.new
=> #<Foo:0x00000005192bc0>
> foo.bar = :baz
=> :baz
> foo.bar
=> :baz
那么,你真的更愿意定义你自己的所有getter和setter吗?或者,只需使用attr_accessor
?