(Ruby/Python/Perl)

  Ruby 语言与Python和Perl的一个很大区别,在于Ruby中,所有的实例变量都是在类中完全私有的,只能通过accessor 方法来进行变量访问,引用一段代码来说明具体的使用方法:

  1. class Rectangle
  2. attr_accessor :width
  3. attr_accessor :height
  4. attr_accessor :width2
  5. attr_accessor :height2
  6.  
  7. def initialize(wdth, hgt)
  8. @width = wdth
  9. @height = hgt
  10. end
  11.  
  12. def area()
  13. return @width * @height
  14. end
  15.  
  16. def area2()
  17. return @width2 * @height2
  18. end
  19.  
  20. end
  21.  
  22. r = Rectangle.new(2,3)
  23. r.width = 5 # give samename's variable value 给同名变量的变量赋值
  24. r.height = 5
  25. puts r.area() # outputs is 25
  26.  
  27. r.width2 = 6 # not samename's variable create 无同名变量的变量创建
  28. r.height2 = 6
  29. puts r.area2() # outputs is 36

attr_reader: 实例变量只读  attr_writer: 实例变量可写  attr_accessor: 变量可读可写

  近来学习ruby的过程中,看到了拟态方法的概念,感觉很有意思。我们都知道拟态方法在ruby中无处不在,可以让代码更清爽更容易理解,比如

  obj.my_attribute=""就不必写成obj.my_attribute=(""),而更进一步的,像attr_accessor这样的类宏的实现方式也引起了我的兴趣。

看了网上的实现方式,自己动手试了一下。

  1. class Module
  2. def var( method_name )
  3. inst_variable_name = "@#{method_name}".to_sym # .to_sym
  4. p inst_variable_name #:=>:@bar
  5.  
  6. define_method method_name do
  7. instance_variable_get inst_variable_name
  8. end
  9.  
  10. define_method "#{method_name}=" do |new_value|
  11. instance_variable_set inst_variable_name, new_value
  12. end
  13.  
  14. end
  15. end
  16.  
  17. class Foo
  18. var :bar
  19. end
  20.  
  21. f = Foo.new # p f.bar
  22. p f.class #:=>Foo
  23. p f.class.instance_methods(false) #:=>["bar", "bar="]
  24. f.bar = "good" #:=>"good" method bar=
  25. p f.bar #:=>"good" method bar

上面的var方法就类似于attr_accessor,对其中的instance_variable_get用代码进行一下说明:

  1. class Fred
  2. #attr_accessor :a #不要去掉注释,先直接运行
  3. #attr_accessor :b
  4.  
  5. def initialize(p1, p2)
  6. @a, @b = p1, p2
  7. end
  8. end
  9. fred = Fred.new('cat', 99)
  10. puts fred.instance_variable_get(:@a) #=> "cat"
  11. puts fred.instance_variable_get("@b") #=> 99
  12. #puts fred.a,fred.b,fred.a.class,fred.b.class
  13. =begin 上一句结果
  14. cat
  15. 99
  16. String
  17. Fixnum
  18. =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. flume 集群安装

    ./pssh -h ./host/all.txt -P mkdir /usr/local/app ./pssh -h ./host/all.txt -P tar zxf /usr/local/soft ...

  2. 使用Reaver对WPS加密网络进行暴力破解

    WPS状态探测 探测开启了WPS功能的AP,WPS Locked状态为NO的表示开启了WPS功能. wash -i wlan0mon PIN码获取 reaver -i wlan0mon -b MAC地 ...

  3. 【Leafletjs】3.拖拽添加marker

    在找leaflet和wfs的相关知识中  看到了这一效果 感觉不错: 这个效果的实现主要使用了JqueryUI的draggable和leaflet的containerPointToLatLng(可由屏 ...

  4. iOS开源项目MobileProject功能点介绍

    一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块的重复开发,MobileP ...

  5. php文件下载

    public function down() { $lang = strtolower(cookie('think_language')); if ($lang == 'en-us') { $file ...

  6. jQuery加载一个html页面到指定的div里

    一.jQuery加载一个html页面到指定的div里 把a.html里面的某一部份的内容加载到b.html的一个div里.比如:加载a.html里面的<div id=“row"> ...

  7. 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 ...

  8. mysql数据校验之字符集问题

    场景:主库DB:utf8字符集备库DB:gbk字符集 需求:校验主备数据是否一致,并且修复 校验过程:设置主库连接为utf8,设置备库连接为gbk,分别进行查询,将返回的的结果集按记录逐字段比较. 显 ...

  9. MYSQL管理之主从同步管理

    原文地址:MYSQL管理之主从同步管理 作者:飞鸿无痕 MYSQL管理之主从同步管理 MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重 ...

  10. hadoop2.2.0伪分布式搭建1--准备Linux环境

    1.0修改网关 点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip 设置网段:19 ...