[No000011]Ruby之attr_reader,attr_writer,attr_accessor理解&用法
(Ruby/Python/Perl)
Ruby 语言与Python和Perl的一个很大区别,在于Ruby中,所有的实例变量都是在类中完全私有的,只能通过accessor 方法来进行变量访问,引用一段代码来说明具体的使用方法:
- class Rectangle
- attr_accessor :width
- attr_accessor :height
- attr_accessor :width2
- attr_accessor :height2
- def initialize(wdth, hgt)
- @width = wdth
- @height = hgt
- end
- def area()
- return @width * @height
- end
- def area2()
- return @width2 * @height2
- end
- end
- r = Rectangle.new(2,3)
- r.width = 5 # give samename's variable value 给同名变量的变量赋值
- r.height = 5
- puts r.area() # outputs is 25
- r.width2 = 6 # not samename's variable create 无同名变量的变量创建
- r.height2 = 6
- puts r.area2() # outputs is 36
attr_reader: 实例变量只读 attr_writer: 实例变量可写 attr_accessor: 变量可读可写
近来学习ruby的过程中,看到了拟态方法的概念,感觉很有意思。我们都知道拟态方法在ruby中无处不在,可以让代码更清爽更容易理解,比如
obj.my_attribute=""就不必写成obj.my_attribute=(""),而更进一步的,像attr_accessor这样的类宏的实现方式也引起了我的兴趣。
看了网上的实现方式,自己动手试了一下。
- class Module
- def var( method_name )
- inst_variable_name = "@#{method_name}".to_sym # .to_sym
- p inst_variable_name #:=>:@bar
- define_method method_name do
- instance_variable_get inst_variable_name
- end
- define_method "#{method_name}=" do |new_value|
- instance_variable_set inst_variable_name, new_value
- end
- end
- end
- class Foo
- var :bar
- end
- f = Foo.new # p f.bar
- p f.class #:=>Foo
- p f.class.instance_methods(false) #:=>["bar", "bar="]
- f.bar = "good" #:=>"good" method bar=
- p f.bar #:=>"good" method bar
上面的var方法就类似于attr_accessor,对其中的instance_variable_get用代码进行一下说明:
- class Fred
- #attr_accessor :a #不要去掉注释,先直接运行
- #attr_accessor :b
- def initialize(p1, p2)
- @a, @b = p1, p2
- end
- end
- fred = Fred.new('cat', 99)
- puts fred.instance_variable_get(:@a) #=> "cat"
- puts fred.instance_variable_get("@b") #=> 99
- #puts fred.a,fred.b,fred.a.class,fred.b.class
- =begin 上一句结果
- cat
- 99
- String
- Fixnum
- =end
我们都知道在ruby中:a等价于"a"但用前面的方法会更清爽,并且少写一个符号。
[No000011]Ruby之attr_reader,attr_writer,attr_accessor理解&用法的更多相关文章
- Ruby attr_reader , attr_writer, attr_accessor方法
attr_reader方法------读取实例变量 attr_writer方法------改写实例变量 attr_accessor方法-----读写实例变量 class Person attr_rea ...
- ruby 疑难点之—— attr_accessor attr_reader attr_writer
普通的实例变量 普通的实例变量,我们没法在 class 外面直接访问 #普通的实例变量,只能在 class 内部访问 class C1 def initialize(name) @name = nam ...
- Ruby字符串(1):String基本用法
String字符串 字符串由String类提供,除了直接使用单双引号或其它字面量创建字符串,也可以使用String.new()方法来创建. a = "hello" b = Stri ...
- query插件之ajaxForm ajaxSubmit的理解用法
如今ajax满天飞,作为重点的form自然也受到照顾. 其实,我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如: $(function(){ $('# ...
- Jquery插件之ajaxForm ajaxSubmit的理解用法
如今ajax满天飞,作为重点的form自然也受到照顾. 其实,我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如: $(function(){ $( ...
- Jquery插件之ajaxForm ajaxSubmit的理解用法(转)
我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如: $(function(){ $('#myForm').submit(function(){ $.aja ...
- ruby http爬虫中的 :body 用法问题
require 'http' url = 'http://localhost/b.php' data = 'whoami=whoami' html = HTTP.via('127.0.0.1',808 ...
- 读<<programming ruby>> 7.6节 flip-flop 理解
书中源码是这样的 File.foreach('1.txt') do |x| if(($. == 1) || x =~ /eig/) .. (($. == 3) || x =~ /nin/) then ...
- ruby语言里的self理解
关键的一句话:关键看谁调用self,self就属于谁 有3种情况: 1.在class或module的定义中,self代表这个class或者这个module对象,代码如下: class S puts ' ...
随机推荐
- Android 隐式意图激活另外一个Actitity
上篇文章<Android 显示意图激活另外一个Actitity>最后谈到显示意图激活另外一个Actitity会有一些局限性和弊端 本文介绍另一种方法:隐式意图激活另外一个Actitity ...
- 3D Touch介绍:电子秤App与快捷操作
随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...
- 我的第一节Android课
我的第一节安卓课程,今天非比寻常的一天,我开始了我程序猿之路的第一节安卓课程,安卓课程只是我的一个兴趣班,我的本专业是java开发,因为喜欢做一个属于自己的一个手机APP,就选多个一样技能,毕竟十八般 ...
- iOS 杂笔-24(常用类到NSObject的继承列表)
iOS 杂笔-24(常用类到NSObject的继承列表) NSString NSObject->NSString NSArray NSObject->NSArray ↑OC基本类都直接继承 ...
- linux下安装opcache扩展
linux下安装opcache扩展 参考:http://www.php.net/manual/zh/opcache.installation.php 1 2 3 4 5 6 7 wget http ...
- .NET读写Excel工具Spire.XlS使用(DataExport )
Introduction E-ICEBLUE is developing office.net component, the main products include Spire.Doc, Spir ...
- IntelliJ IDEA 使用Git怎样记住密码和忘记密码的方法
IntelliJ IDEA 使用Git怎样记住密码的方法 1.当使用Ctrl+T进行更新时,弹出密码框(此时不要输入任何字符),直接点"Cancel" 2.略等二三秒,会弹出新的密 ...
- 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
- MongoDB 优点
任何关系型数据库,具有典型的架构设计,显示表和这些表之间的关系.虽然在 MongoDB中,没有什么关系的概念. MongoDB比RDBMS的优势 架构:MongoDB是文档型数据库,其中一个集合保存不 ...
- 天书笔记:HTML+CSS实现顶部导航栏
此笔记纯属本人脑残笔记,阅读困难不理解属正常现象,初学者尽量不要阅读,否则轻则口吐白沫重则走火入魔,切记切记 先晒效果图: 效果要求类似于b站的顶部导航(..原谅我老是拿b站做例子:) ) 然后是代码 ...