[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 ' ...
随机推荐
- word第二讲(0806)
word里的长度单位 绝对长度单位(厘米,英寸) 相对长度单位(字符,像素) 样式 问题: 如何设置多个部分的格式 多次选择,多次设置 多次选择,一次设置 应用格式刷(ctrl+shift+c,ctr ...
- Android 创建自己的Camera App
在sdk中找到/sdk/docs/guide/topics/media/camera.html#custom-camera,里面有详细的api参考 在清单文件中添加相应的权限: <uses-pe ...
- IOS客户端Coding项目记录导航
IOS客户端Coding项目记录(一) a:UITextField设置出现清除按键 b:绘画一条下划线 表格一些设置 c:可以定义表头跟底部视图(代码接上面) d:隐藏本页的导航栏 e:UIEdge ...
- 干货之UIButton的title和image自定义布局
当需要实现一个自定义布局图片和标题的按钮时候,不知道有多少少年直接布局了UIButton,亦或是自定义一个UIView,然后以空白UIButton.UILabel.UIImageVew作为subVie ...
- 如何为Swift进行宏定义
这阵子一直在自学Swift, 因为之前iOS的开发一直用Objective-C, 所以习惯了C语言那种宏定义方式, Swift作为一款更加安全的语言, 放弃了C语言中的宏定义, 有效的防止预编译时代码 ...
- UISegmentedControl(人物简介)
效果图 当你点击上面人物名字的时候 ,就可以随意切换人物. 这个很有趣 , 你还可以试着添加音乐播放器 .以及一些别的来完善你想做的. 好吧 , 废话不多说 , 上代码. #import " ...
- MVP模式在Android项目中的使用
以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算不上MV ...
- Mac OS 文件、文件夹重命名的方法
在Mac OS中,文件和文件名重命名的方法非常简单 选中你想要命名的文件或者文件夹,按回车,可以直接重命名,输入你要修改的内容,确认后,再按回车就OK啦--- 希望能对你有所帮助^_^
- linux 学习随笔-文件目录管理
1:绝对路径:写法一般由'/'根目录引起的 '/'表示根目录 2:相对路径:不是由'/'引起的 需要先进入/ 在进入其它文件 3:mkdir -p +目录+文件夹 可以用于创建不存在的级联目录 不 ...
- WPF学习之路(十二)控件(Content控件)
Label Label相比TextBlock功能并不强大,但是支持键盘快捷键的方式获得焦点 <StackPanel> <Label Target="{Binding Ele ...