Ruby学习笔记(17)_attr_accessor attr_reader attr_writer
来源:互联网 发布:目前淘宝什么好卖 编辑:程序博客网 时间:2024/05/21 22:58
看完别人的帖子总结一脸懵逼, 什么鬼, 不就是最基本的getter, setter, 为什么乱七八糟的设定这么多, 现在还没研究ruby编辑器, 如果有快捷键给变量加getter, setter 不就是美滋滋了嘛
普通的实例变量
普通的实例变量,我们没法在 class 外面直接访问
#普通的实例变量,只能在 class 内部访问class C1 def initialize(name) @name = name endendt1 = C1.new( {'a' => 1, 'b' => 2})puts t1.name #报错: undefined method `name' for #<Context::C1:0x0000000142cd30 @name={:a=>1, :b=>2}>
因为默认的类中变量是private修饰, 类外想调用可以设置getter, setter.
Ruby提供也提供了方法,只要指定实例变量名的符号(symbol) , Ruby 就会自动帮我们定义相应的存取器。
attr_reader :arg
attr_reader 限制实例变量 arg 在 class 外部只可读,其相当于在 class 中同时定义了一个 arg 方法
#添加一个可 read 属性,在 class 外部只可 read 该实例变量(等同于通过 instance.arg 方法),而不可对该变量赋值(相当于调用 instance.arg= 方法不存在)#attr_reader 的限定有点类似 C 中 int const * p的作用,限定的是变量,而非变量指向的对象class C2 attr_reader :name def initialize(name) @name = {'a' => 1, 'b' => 2} endendt2 = C2.new( {'a' => 1, 'b' => 2})puts t2.name # 正确: {"a"=>1, "b"=>2}puts (t2.name).delete('a') # 正确: attr_reader 保护的是变量 name ,但是变量 name 指向的对象内容是可变的puts t2.name # 正确: {"b"=>2}puts t2.name = {'c' => 3} # 报错: undefined method `name=' for #<Context::C2:0x000000021cdf48 @name={"b"=>2}>#为了说明隐式定义了 t2.name() 方法,下面通过方法调用的形式来访问t2 = C2.new( {'a' => 1, 'b' => 2})puts t2.name() # 正确: {"a"=>1, "b"=>2}
attr_writer :arg
attr_reader 限制实例变量 arg 在 class 外部只可写,其相当于在 class 中同时定义了一个 arg= 方法
#添加一个可 write 属性,在 class 外部只可 write 该实例变量class C3 attr_writer :name def initialize(name) @name = name endt3 = C3.new( {'a' => 1, 'b' => 2})puts t3.name # 报错:undefined method `name' for #<Context::C3:0x0000000140afc8 @name={:a=>1, :b=>2}>puts t3.name = {'c' => 3} # 正确:{"c"=>3}puts (t3.name).delete(:c) # 报错:(没有定义方法 name,所以不能用这种方式企图获取到 name 变量指向的对象): undefined method `name' for #<Context::C3:0x000000021e9c70 @name={"c"=>3}>
attr_reader 限制实例变量 arg 在 class 外部只可读,其相当于在 class 中同时定义了一个 arg 和 arg= 方法
class C4 attr_accessor :name def initialize(name) @name = name endendt4 = C4.new({'a' => 1, 'b' => 2})puts t4.name #正确:相当于调用 t4.name() 方法puts t4.name={'c' => 3, 'd' => 4} #正确:相当于调用 t4.name=() 方法puts t4.name #正确:{"c"=>3, "d"=>4}#为了说明隐式定义了 t4.name() 和 t4.name=() 方法,下面通过方法调用的形式来访问puts t4.name=( {'e' => 5, 'f' => 6} ) puts t4.name() #正确:{"e"=>5, "f"=>6}
阅读全文
0 0
- Ruby学习笔记(17)_attr_accessor attr_reader attr_writer
- [Ruby笔记]17.Ruby attribute attr_reader attr_writer attr_accessor attr
- ruby之attr_reader,attr_writer,attr_accessor
- Ruby语法解释:attr_reader,attr_writer和attr_accessor
- Ruby语法解释:attr_reader,attr_writer和attr_accessor
- attr_writer :age attr_reader :name
- attr_writer、attr_accessor、attr_reader
- attr,attr_accessor,attr_reader,attr_writer
- attr_accessor :motherland 相当于attr_reader:motherland; attr_writer :motherland
- Ruby: attr_reader &attr_accessor用法
- 【菜鸟】ruby attr_reader的困惑
- 【ruby学习笔记】初探ruby
- Ruby语法学习笔记
- Ruby学习笔记(入门)
- watir学习笔记/ruby
- ruby学习笔记一
- ruby学习笔记二
- ruby学习笔记三
- 【spring学习笔记二】使用注解配置spring
- 如何remove the last node in LLL
- 2017.10.23 模拟考试 (题目来自:学大伟业)
- 在windows如何使用pip安装包
- JAVA8 十大新特性详解
- Ruby学习笔记(17)_attr_accessor attr_reader attr_writer
- 1.偏头痛杨的常见设计模式入门系列之什么是设计模式篇
- SQL使用技巧
- 2017.10.23 mmap()函数说明
- openshift/origin学习记录(12)——离线安装集群
- Git使用教程
- 调整对比度及亮度
- 收集点小知识,各种希腊字母的读法
- Server Tomcat v8.0 Server at localhost failed to start