当我们在rails应用程序中需要attr_accessor时?

时间:2017-12-12 19:28:20

标签: ruby-on-rails ruby

任何人都可以解释为什么我们需要在我们的rails应用程序中使用attr_accessor(当我们真正需要它时的真实场景)?尽管它的存在是暂时的,但它对我们的应用程序有何帮助?

2 个答案:

答案 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​​类可以通过三种方式公开其属性:accessorsreaderswriters。使用访问者,您可以阅读值,您可以阅读的读者和的作者。为什么这很重要呢?在OOP中你有encapsulation这个概念,你应该只暴露所需要的东西和所需的访问权限,以避免某人在一次操作中使你的电视当前音量从50跳到100,同时电视应该增加它或减少它1.所以你应该只以不影响它应该工作的方式(业务规则)的方式向你的类的消费者,属性和操作公开。

深入了解这些概念,你可能会更好地理解ruby访问器,它只是一种语法,可以通过类外部的读写权限来访问对象状态;)

答案 1 :(得分:0)

attr_accessorattr_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