`
fantaxy025025
  • 浏览: 1345527 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Ruby之self详解(二)_以及双冒号语法

 
阅读更多

 

请先看前一篇关于self的讲解:http://fantaxy025025.iteye.com/blog/1108639

另外,如果有时间看看rails高级编程,会有更深入的理解,这本书讲的还是满深入的。

 

熟悉一个例子

class A

  class B

    puts "self in class A::B is |#{self}|"
    def self.klass_method_b
      puts "self in #{__method__} is |#{self}|"
    end

    def ist_method_a
      puts "self in #{__method__} is |#{self}|"
    end

  end

end

ab = A::B.new
#ab.klass_method_b #undefined method `klass_method_b' for #<A::B:0xb754bf20> (NoMethodError)
A::B.klass_method_b
ab.ist_method_a

输出:

self in class A::B is |A::B|

self in klass_method_b is |A::B|

self in ist_method_a is |#<A::B:0xb76d9f18>|

 

 

熟悉一下module中的self

 

module A
  module B
    puts "self in module A::B is |#{self}|"
    def method_a
      puts "self in method_a of module A::B is |#{self}|"
    end
  end
end
class AB
  include A::B
end
(ab = AB.new).method_a

 输出:

 

self in module A::B is |A::B|

self in method_a of module A::B is |#<AB:0xb76a7568>|

解释:
module全局作用域内的self还是没有变,就是Module;对于此处就是A::B
module的方法是要给混入的类用的,所以方法作用域的self还是当前的实例

看一下ruby中,两个冒号开头的语法意义
class C
  def m_c
    puts __method__
  end
end
module A
  module B

    class C
      def m_a_b_c
        puts __method__
      end
    end

    class D < C

    end

    class E < ::C

    end

    puts C
    puts ::C
    puts self
    puts self::C

  end
end
 输出:
A::B::C
C
A::B
A::B::C
m_c
解释:
这种双冒号开头语法本质上是去除了默认的作用域slef的限制,使得双冒号开头解释为self==Object,也就是说,::C==Object::C
但没有::开头的类C表示self::C(为什么呢,看其所在的作用域)
这样就可以解决到底extends哪个模块的问题了(例子中继承了哪个C)
为啥不写为Object::C呢:
  原因1:简单,至少少敲了5次键,这也很符合perl的逻辑,嘿嘿;
  原因2:以后扩展方便么,万一Object也有顶层类等变化呢,待讨论咯,反正我这么觉得,你看ruby1.9已经这么干了


OK
OK
OK
## ruby语言是我用过的最舒服的语言!
OK
OK
OK

 

分享到:
评论
3 楼 fantaxy025025 2012-05-20  
tedeyang 写道
请先看前一篇关于self的讲解:http://fantaxy025025.iteye.com/admin/blogs/1108639
这个url错了,除了admin,其他人无法访问。

另外,最后一段代码为什么会多输出一行 “m_c”?


url改了,thanks!
最后一行的,我也忘记了,多半是调试别的程序,粘贴多了~
2 楼 tedeyang 2012-05-20  
请先看前一篇关于self的讲解:http://fantaxy025025.iteye.com/admin/blogs/1108639
这个url错了,除了admin,其他人无法访问。

另外,最后一段代码为什么会多输出一行 “m_c”?
1 楼 tedeyang 2012-05-20  
很好的解释。我是为双冒号来的。不得不说ruby隐晦的地方很多啊。

相关推荐

    08Ruby 模块.docx

    ### Ruby 模块详解 #### 一、Ruby 模块简介 在 Ruby 语言中,模块(Module)是一个非常重要的概念。它不仅提供了一种组织代码的有效方式,还支持一种称为 Mixin 的特殊继承机制。模块可以被视为一个容器,用于存放...

    06Ruby 方法.docx

    ### Ruby 方法详解 #### Ruby 语言简介 Ruby 是一种动态、面向对象的脚本语言,以其简洁、清晰的语法著称。它支持多种编程范式,包括面向对象、命令式和函数式编程,并且拥有强大的元编程能力。Ruby 的设计哲学强调...

    blog制作详解文档以及源码

    总结,通过学习和实践这个Ruby博客制作项目,初学者不仅能掌握Ruby语言的基本语法,还能了解到Web开发的核心概念,包括路由、数据库操作、模板引擎以及测试。这是一个极好的起点,为后续的Ruby on Rails学习打下坚实...

    详解Ruby中的单件方法和单件类

    ### 详解Ruby中的单件方法和单件类 在Ruby编程语言中,单件方法(Singleton Method)和单件类(Singleton Class)是两个非常重要的概念。这些特性为Ruby提供了强大的灵活性,允许开发者针对特定的对象定义唯一的...

    ruby的API文档,有需要同事请下载

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。Ruby的API(应用程序接口)文档是开发者理解和使用Ruby语言的重要资源,它详细介绍了Ruby的标准库、类、模块、方法等...

    Ruby语言入门教程&代码示例.pdf

    ### Ruby语言基础知识与示例详解 #### 一、Ruby简介 Ruby是一种面向对象的脚本语言,具有简单、高效的特点。它由日本人松本行弘(Yukihiro Matsumoto)于1995年设计并发布。Ruby的设计哲学强调程序员的生产力和...

    Ruby语言教程和经典案例

    ### Ruby语言教程和经典案例详解 #### Ruby语言基础语法教程 **1. 变量和数据类型** 在Ruby中,变量声明相对灵活,通常无需显式地使用`var`关键字,可以直接通过赋值来声明变量。例如: ```ruby name = "Alice" ...

    Ruby常见面试题.pdf

    ### Ruby常见面试题详解 #### 1. 什么是Ruby?简要介绍Ruby的特点和主要用途。 **Ruby**是一种面向对象的、动态类型的解释性脚本语言。它由日本程序员松本行弘(Matz)于1995年设计并发布。Ruby的设计理念在于简洁...

    动态加载的艺术:Ruby中require与load的区别

    Ruby 受到了多种语言的影响,包括 Perl、Smalltalk、Eiffel、Ada 以及 Lisp 等。 Ruby 的主要特点包括: 1. **动态类型**:变量类型在运行时确定,使得代码更加灵活。 2. **面向对象**:几乎所有元素都是对象,这...

    Ruby中一些基本语法知识点的罗列汇总

    ### Ruby基本语法知识点详解 #### 一、简介 Ruby 是一种简单快捷的脚本语言,易于理解且功能强大。本文档旨在对Ruby中的一些基本语法知识点进行归纳总结,特别是注释与标识符等方面的基础内容。 #### 二、Ruby...

    介绍Ruby中的模块与混合类型的相关知识

    ### Ruby中的模块与混合类型详解 #### 模块概述 在Ruby编程语言中,模块(Modules)是一个重要的概念,主要用于组织代码以及实现某些特定的功能,比如混合(Mix-in)。模块可以被视为一组方法、类和常量的集合。...

    ruby_tutorial

    Ruby教程详解 Ruby是一种强大的、面向对象的编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1993年设计并开发。它以其简洁、优雅的语法和对程序员的友好性而闻名,深受开发者喜爱。Ruby的核心设计理念是让编程变...

    RubyLanguageQuickRef

    ### Ruby语言快速参考指南 #### 一、简介 Ruby是一种动态的、开源的编程语言,以其简洁性和高效性而著称。它具有优雅的语法结构,使得代码既易于阅读也易于编写。本指南旨在为初学者和有经验的开发者提供一个快速...

    PyPI 官网下载 | aasm-0.0.7.tar.gz

    1. **简洁的语法**:AASM提供了一种直观的Ruby风格的语法来定义状态和事件,使得代码可读性更高。 2. **事务支持**:状态转换可以在数据库事务中执行,确保数据一致性。 3. **回调**:可以在状态转换前后定义回调...

    Masonry的使用

    ### Masonry 的使用详解 #### 一、简介 Masonry 是一个用于 iOS 和 macOS 开发的轻量级布局框架,其主要特点在于提供了一种更加优雅的链式语法来实现自动布局(Auto Layout),相较于传统的 Interface Builder 或者...

Global site tag (gtag.js) - Google Analytics