`

ruby元编程读书笔记

 
阅读更多
1.ruby类
以下多次定义,并不是定义了多个ClassName类,是同一个类
当第一次使用class Shape定义这个类的时候,这个类并不存在,因此直接定义;当二次定义同样类名的类时,这个类已经存在,不再重新定义,而是打开这个类,在其中定义新方法。
irb(main):024:0> class Shape
irb(main):025:1> def print_width
irb(main):026:2> p @width
irb(main):027:2> end
irb(main):028:1> def initialize(width,length)
irb(main):029:2> @width = width
irb(main):030:2> @length = length
irb(main):031:2> end
irb(main):032:1> end
=> nil
irb(main):033:0> class Shape
irb(main):034:1> def print_length
irb(main):035:2> p @length
irb(main):036:2> end
irb(main):037:1> end
=> nil
irb(main):038:0> shape = Shape.new(1,2)
=> #<Shape:0x1b5a5cf @width=1, @length=2>
irb(main):039:0> shape.print_length
2
=> nil
irb(main):041:0> shape.print_width
1
=> nil
irb(main):042:0>


2.类方法定义的方式:
class User
  def self.p_basic_infor(name,age)
    p "#{name},#{age}"
  end

  def User.say_hello(name)
    p "#{name} say hello to you!"
  end

  class << self
    def update_infor(name)
      p "update the infor for #{name}"
    end
  end
end

User.p_basic_infor("tom",12)
User.say_hello("jack")
User.update_infor("Lily")
p User.singleton_methods

3.ruby实例变量
(1)只有给实例变量赋值的时候,实例变量才真正存在。
class User
  def method
    @v = 1
  end
end

user_1 = User.new
p user_1.instance_variables  #=〉[]

user_2 = User.new
user_2.method
p user_2.instance_variables  #=〉[@v]


(2)类变量是实例层面的,方法是类层面的,因此类的不同实例可以共用同一个方法,但是不同的实例却不能共用同一个实例变量。类的不同实例不能共用同一个实例变量见下面例子:
user_1 = User.new
user_1.method
p user_1.instance_variables  #["@v"]

user_2 = User.new
user_2.method
p user_1.instance_variables.equal?(user_2.instance_variables) #false



4.ruby作用域
ruby存在作用域的概念,出了某个作用域,变量的生命周期就结束了,常见的作用域门包括:class,def,module
冲破scope的方法是:
(1)使用Class.new代替class
(2)使用Module.new代替module
(3)使用define_method代替def
irb(main):001:0> name = "tom"
=> "tom"
irb(main):002:0> class User
irb(main):003:1> def p_name
irb(main):004:2> p "#{name} in the method"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> user = User.new
=> #<User:0x1bb326c>
irb(main):008:0> user.p_name
NameError: undefined local variable or method `name' for #<User:0x1bb326c>
        from (irb):4:in `p_name'
        from (irb):8

irb(main):001:0> length = 1
=> 1
irb(main):002:0> Shape = Class.new do
irb(main):003:1* define_method :p_length do
irb(main):004:2* p "#{length} is in the method"
irb(main):005:2> end
irb(main):006:1> end
=> Shape
irb(main):007:0> Shape.new.p_length
"1 is in the method"
=> nil
irb(main):008:0>


5.ruby块
ruby块不是对象,使用Proc可以将块转为对象,将块转为Proc的方法包括:
#method_1
inc = Proc.new   
inc.call(2)

#method_2
dec = lambda {|x| x-1}   
dec.call(2)

#method_3
def match(a,b)
  yield(a,b)
end
def do_match(a,b,&operation)
  p match(a,b,&operation)
end
do_match(3,2) {|x,y| x*y}

相反的,也可以将Proc转为block
#convert Proc to block
def my_method(a,b)
  p "#{yield(a,b)}"
end

my_proc = proc{|x,y| x+y}
my_method(1,2,&my_proc)


6.
(1)eigenclass是ruby的元类,是匿名类,在其中定义的方法称为Singleton Method
(2)打开eigenclass的方法有两种:
class User
  def print_inf
    p "user method"
  end

  class << self  #open eigenclass
    def say_hello  #define Singleton Method
      p "hello"
    end
  end
 
 def User.hello(name) #define Singleton Method
   p "hello, #{name}"
 end

  class << User  #open eigenclass
    def say_goodbye  #define Singleton Method
      p "goodbye"
    end
  end

  def self.say_hi
    p "hi"
  end
end

p User.singleton_methods
分享到:
评论

相关推荐

    Programming Ruby(读书笔记)-3章

    《Programming Ruby》是一本关于Ruby编程语言的经典书籍,它的第三章深入探讨了Ruby的基本语法和核心概念。在这一章中,作者介绍了变量、常量、符号、数组、哈希等核心数据类型,以及控制流(条件语句和循环)和方法...

    一个后端技术栈分享平台,主要收集后端相关的技术文档、读书笔记、专题学习等。.zip

    后端开发者通常需要掌握如Java、Python、Node.js、Ruby等编程语言,以及数据库技术如MySQL、PostgreSQL、MongoDB,还有框架如Spring Boot、Django、Express等。 技术文档是后端开发者日常工作中不可或缺的参考资料...

    Terry七月Ruby读书笔记(比较详细)第1/4页

    ¨ 解释执行:Python,Ruby,交互性很好; ¨ 编译执行:Pascal, C,速度较快。 n 本地执行,如C,C++; n 虚拟机执行,如Java, C#。   ¨ 动态语言,如JavaScript,Ruby; ¨ 静态语言,如C++,Java。   ...

    rabbitmq读书笔记

    【RabbitMQ读书笔记】 一、简介 RabbitMQ 是一个开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,旨在提供可靠且灵活的消息传递服务。RabbitMQ 在当前的软件行业中被广泛使用...

    tuiblogs, 优秀的计算机编程类博客和文章共享出色的博客和网站.zip

    tuiblogs, 优秀的计算机编程类博客和文章共享出色的博客和网站 ##介绍使用发出以及请求请求优秀博客语言无关类语言相关类C/C++css/htmlDartJavaScript插件iOS插件pythonruby走。读书笔记及其它杨文博 ( 供职

    kindleSplit:自动拆分kindle读书笔记为1条1条记录。后续考虑整理保存到数据库用web方式显示

    【kindleSplit】是一个自动化工具,专为Kindle用户设计,用于将Kindle阅读器中的读书笔记拆分成单独的条目。这个工具的核心功能是将原本整合在一起的笔记内容拆分成独立的记录,便于管理和进一步的整理。尤其适用于...

    Ruby on Rails心得

    陈刚撰写的《Ruby on Rails心得_V0.1》是一份非常宝贵的资料,旨在记录作者在学习Ruby on Rails过程中的所见所得,包括读书笔记、心得体会、自创教程及一些常见问题的解决方案。作者通过写作这种方式不仅加深了对...

    javaee笔试题-heyuan110.github.com.comments:heyuan110.github.com评论

    读书笔记及其它 语言无关类 操作系统 (简体) (中英文版) WEB服务器 (淘宝团队出品) 版本控制 NoSQL () MySQL 项目相关 (译言网) Web 编程艺术 【第一部分】 语言相关类 C/C++ () (宋劲杉, 北京亚嵌教育研究中心) (中...

    javaee笔试题-jenkins-demo:詹金斯演示

    读书笔记及其它 语言无关类 操作系统 (简体) (中英文版) WEB服务器 (淘宝团队出品) 版本控制 NoSQL () MySQL 项目相关 (译言网) Web 编程艺术 【第一部分】 语言相关类 C/C++ () (宋劲杉, 北京亚嵌教育研究中心) (中...

    python学习源码和开发应用技术

    - **《Python编程金典》读书笔记**:这是一份基于经典书籍的学习笔记,可以帮助读者更好地消化和吸收书中的知识要点。 - **PHP、Python、Ruby的(数据库、文件)比较(原创)**:通过对三种语言在处理数据库和文件操作...

Global site tag (gtag.js) - Google Analytics