(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理解&用法的更多相关文章

  1. Ruby attr_reader , attr_writer, attr_accessor方法

    attr_reader方法------读取实例变量 attr_writer方法------改写实例变量 attr_accessor方法-----读写实例变量 class Person attr_rea ...

  2. ruby 疑难点之—— attr_accessor attr_reader attr_writer

    普通的实例变量 普通的实例变量,我们没法在 class 外面直接访问 #普通的实例变量,只能在 class 内部访问 class C1 def initialize(name) @name = nam ...

  3. Ruby字符串(1):String基本用法

    String字符串 字符串由String类提供,除了直接使用单双引号或其它字面量创建字符串,也可以使用String.new()方法来创建. a = "hello" b = Stri ...

  4. query插件之ajaxForm ajaxSubmit的理解用法

    如今ajax满天飞,作为重点的form自然也受到照顾. 其实,我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如:   $(function(){ $('# ...

  5. Jquery插件之ajaxForm ajaxSubmit的理解用法

      如今ajax满天飞,作为重点的form自然也受到照顾. 其实,我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如:   $(function(){ $( ...

  6. Jquery插件之ajaxForm ajaxSubmit的理解用法(转)

    我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如: $(function(){ $('#myForm').submit(function(){ $.aja ...

  7. ruby http爬虫中的 :body 用法问题

    require 'http' url = 'http://localhost/b.php' data = 'whoami=whoami' html = HTTP.via('127.0.0.1',808 ...

  8. 读<<programming ruby>> 7.6节 flip-flop 理解

    书中源码是这样的 File.foreach('1.txt') do |x| if(($. == 1) || x =~ /eig/) .. (($. == 3) || x =~ /nin/) then ...

  9. ruby语言里的self理解

    关键的一句话:关键看谁调用self,self就属于谁 有3种情况: 1.在class或module的定义中,self代表这个class或者这个module对象,代码如下: class S puts ' ...

随机推荐

  1. SharePoint 2013 BCS

    http://liandove.blog.51cto.com/176335/1247410 http://liandove.blog.51cto.com/176335/1249339 http://l ...

  2. AS下NDK开发(一)

    捣鼓了一天的NDK,总结下. Eclipse下开发ndk好像挺麻烦的样子,看书上要下载Cygwin,eclipse还要下载插件CDT..而在AS上就方便多啦.下载android ndk.安装,配置环境 ...

  3. Android 播放在线视频

    首先开启电脑上的tomcat,将视频文件放在Tomcat 7.0\webapps\ROOT中 不用修改代码,直接输入地址即可,运行如下: 播放在线视频,必须要求手机支持当前的格式,才可以播放 播放的原 ...

  4. 【原】ios的hitTest方法以及不规则区域内触摸事件处理方法

    概述 在正常的使用场景中,我们处理了比较多的矩形区域内触摸事件,比如UIButton.UIControl.一般来说,这些控件的图形以及触摸区域都是矩形或者圆角矩形的.但是在一些特殊应用场景中我们有时不 ...

  5. HtmlHelper用法大全

    HTML扩展类的所有方法都有2个参数: 以textbox为例子 public static string TextBox( this HtmlHelper htmlHelper, string nam ...

  6. 今天简单说一下cdc 的使用

    从08开始,sql server 提供了一种叫做 变更数据捕获 cdc(Change Data Capture) 的功能,可以通过启用这个功能,来实现查看数据库中的表对象的数据的变化情况.(我感觉就是 ...

  7. java -jar 执行 eclipse export 的 jar 包报错处理

    1. 错误1:打 jar 包执行,报错,找不到 类库的 jar 包 F:\>java -jar remoteLogin.jarException in thread "AWT-Even ...

  8. Linux[Fedora]查找文件包含的字段

    find 与 grep组合查找 find . –name '文件类型' | xargs grep –n '查找内容'文件类型可正则表达式通配, [.]表示当前目录下进行查找,也可自由指定目录.比如: ...

  9. java学习之 反射

    以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习 ...

  10. Linux系统管理命令之用户管理

    1.添加用户useradd   2.删除用户userdel userdel aming 彻底删除用户(包括删除用户目录) userdel -r aming 3.用户修改usermod