[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 ' ...
随机推荐
- flume 集群安装
./pssh -h ./host/all.txt -P mkdir /usr/local/app ./pssh -h ./host/all.txt -P tar zxf /usr/local/soft ...
- 使用Reaver对WPS加密网络进行暴力破解
WPS状态探测 探测开启了WPS功能的AP,WPS Locked状态为NO的表示开启了WPS功能. wash -i wlan0mon PIN码获取 reaver -i wlan0mon -b MAC地 ...
- 【Leafletjs】3.拖拽添加marker
在找leaflet和wfs的相关知识中 看到了这一效果 感觉不错: 这个效果的实现主要使用了JqueryUI的draggable和leaflet的containerPointToLatLng(可由屏 ...
- iOS开源项目MobileProject功能点介绍
一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块的重复开发,MobileP ...
- php文件下载
public function down() { $lang = strtolower(cookie('think_language')); if ($lang == 'en-us') { $file ...
- jQuery加载一个html页面到指定的div里
一.jQuery加载一个html页面到指定的div里 把a.html里面的某一部份的内容加载到b.html的一个div里.比如:加载a.html里面的<div id=“row"> ...
- Effective Java Index
Hi guys, I am happy to tell you that I am moving to the open source world. And Java is the 1st langu ...
- mysql数据校验之字符集问题
场景:主库DB:utf8字符集备库DB:gbk字符集 需求:校验主备数据是否一致,并且修复 校验过程:设置主库连接为utf8,设置备库连接为gbk,分别进行查询,将返回的的结果集按记录逐字段比较. 显 ...
- MYSQL管理之主从同步管理
原文地址:MYSQL管理之主从同步管理 作者:飞鸿无痕 MYSQL管理之主从同步管理 MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重 ...
- hadoop2.2.0伪分布式搭建1--准备Linux环境
1.0修改网关 点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip 设置网段:19 ...