ruby 基础知识 - Class 与 Module
1. 因為 Ruby 並沒有「屬性」(property/attribute)這樣的設計,要取用實體變數,需要另外定義的方法才行:
class Cat
def initialize(name, gender)
@name = name
@gender = gender
end def name
@name
end def name=(new_name)
@name = new_name
end
end
改写 => 使用 attr_reader、attr_writer 以及 attr_accessor 定义「讀取」、「設定」以及「讀取 + 設定」的方法,所以原來的有點囉嗦的寫法就可使用 attr_accessor
class Cat
attr_accessor :name def initialize(name, gender)
@name = name
@gender = gender
end
end
2. 定义类方法
class Cat
def self.all
# ...
end
end
或者
class Cat
class << self
def all
# ...
end
end
end
3. 方法的存取控制
注意: initialize 方法,它永遠是 private 的,只會被 new 方法调用。
一般使用
class Cat
def eat
puts "好吃!"
end protected
def sleeping
puts "zzzzzzzzz..."
end private
def gossip
puts "我跟你說,你不要跟別人說喔!"
end
end
另一種的方法存取限制是寫在方法定義之後
class Cat
def eat
puts "好吃!"
end def sleeping
puts "zzzzzzzzz..."
end def gossip
puts "我跟你說,你不要跟別人說喔!"
end protected :sleeping
private :gossip
end
使用说明:
1)其實 public、protected 以及 private 這三個在 Ruby 裡並不是關鍵字,它只是一般的方法而已。
2)private 方法没有调用者 recevier,前面不可以有小数点。
在 Ruby 的 private 方法其實不只類別自己內部可以存取,它的子類別也可以,並沒有像其它程式語言一樣的繼承限制。
比如:
puts "Hello Ruby"
而
self.puts "Hello Ruby" # NoMethodError
3) protected 方法,從外部來看,它跟 private 一樣,不能直接使用。
但在類別內部,它的規定就沒那麼嚴格了,你要指定或不指定 recevier 都可以。
4)private 其实也可以在外部调用
class Cat
def say_hello
self.gossip
end private
def gossip
puts "我跟你說,你不要跟別人說喔!"
end
end kitty = Cat.new
kitty.gossip # => NoMethodError
kitty.send(:gossip) # => 我跟你說,你不要跟別人說喔!
咦?不是說呼叫 private 方法的時候不能有明確的接收者嗎?你仔細看,並沒有違反這個規定喔,這邊我是執行 send 方法,把 gossip 當做參數傳給它而已,所以不算違反規定。
4. 开放类别 Open Class
class Cat
def abc
# ...
end
end class Cat
def xyz
# ...
end
end kitty = Cat.new
kitty.abc # => 會發生什麼事?
kitty.xyz # => 會發生什麼事?
1)两个相同的类会进行融合。
上面的两个类会变成这样
class Cat
def abc
# ...
end def xyz
# ...
end
end
除此之外,还可以对内建的类别进行融合
class String
def say_hello
"hi, I am #{self}"
end
end
puts "eddie".say_hello # => hi, I am eddie
puts "kitty".say_hello # => hi, I am kitty
2)Open Class 覆盖原来的方法。
class Integer
def +(n)
1000
end
end puts 1 + 2 #=> 得到 1000
puts 3 + 4 #=> 得到 1000
改写
class Integer
alias :original_plus :+ def +(n)
puts "hey hey hey"
original_plus(n)
end
end puts 1 + 2
puts 3 + 4
这里使用了 Ruby 內建的 alias 方法把原本的 + 方法加個別名 original_plus,然後再新定義的 + 方法裡,再呼叫它原本的算法。執行之後就會發現計算結果跟原本的 + 是一樣的,但會偷偷多印了 hey hey hey 字樣在畫面上。
5. 模组
定义一个模组
module Flyable
def fly
puts "I can fly!"
end
end
引入模组
class Cat
include Flyable
end kitty = Cat.new
kitty.fly # => I can fly!
Ruby 中 Include, Extend, Load, Require 的使用区别
「類別」的上層類別就是「模組」,開 IRB 實驗一下:
$ irb
>> Class.superclass
=> Module
区别
$ irb
>> Class.instance_methods - Module.instance_methods
=> [:new, :allocate, :superclass]
可以發現身為「後代」的 Class 類別,比 Module 類別多了 3 個方法,就是因為 Module 類別少了這 3 個方法,所以它跟 Class 最大的差別,就是:
- 模組沒辦法
new一個新的實體出來。 - 模組沒辦法繼承別的模組。
除此之外,模組跟類別在本質上沒什麼太大的差別。
末尾!
ruby 基础知识 - Class 与 Module的更多相关文章
- ruby基础知识之 class&module
以下分别介绍了class方法和module方法,还有最简单的def方法. 其中module和class的区别下面会说,这里首先声明,def定义的方法,需要定义对象后才能调用,而class和module ...
- ruby 基础知识(一)
突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html 相信初学者会受益颇多 ruby 参考文档 ...
- 【ruby】ruby基础知识
Install Ruby(安装) For windows you can download Ruby from http://rubyforge.org/frs/?group_id=167 for L ...
- ruby 基础知识(二)
ruby 中的动态方法 http://singleant.iteye.com/blog/1680382 Rails 大量使用了符号(symbol).符号看上去很像变量名,不过以冒号作为前缀.符号的例 ...
- 1. Ruby基础知识
1. Ruby执行选项 符号 作用 -c 检查代码正确性 -w 警告模式运行 -e 字面脚本 -l 行模式运行 单独 ruby -c Hello.rb 组合 ruby -le 'print " ...
- ruby 基础知识三 读写文件
1.File 中参数的含义 r 只读模式.文件指针被放置在文件的开头.这是默认模式. r+ 读写模式.文件指针被放置在文件的开头. w 只写模式.如果文件存在,则重写文件.如果文件不存在,则创建一个新 ...
- ruby 基础知识2 - 区块 block
原文 1. block中的 yield 与遍历 5.times do |i| puts i end 或者 def my_times(n) i = 0 while n > i i += 1 yie ...
- ruby基础(四)
ruby基础知识 模块 模块是ruby的特色功能之一.如果说类是事物的实体以及行为,那么模块表现的 就是事物的行为部分,模块和类有以下两点不同: 模块不能拥有实例 模块不能被继承 模块的使用方法 mo ...
- Ruby基础教程
一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...
随机推荐
- mybatis检测mysql表是否存在
1.优先使用information_schema来检查,如果没有查询这个的权限则使用show tables来检查. mapper: import java.util.Map; import org.a ...
- Nginx——location匹配与在配置中的优先级
1. location表达式类型 location ^~ /api/v7/ { proxy_next_upstream http_404 http_500 http_502 http_503 http ...
- CoreGraphics之CGContextSaveGState与UIGraphicsPushContext
转至:https://www.jianshu.com/p/be38212c0f79 CoreGraphics与UIKit 这边从iOS绘图教程 提取一些重要的内容. Core Graphics Fra ...
- utf-8 编码问题
使用下面直接进行处理$str = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $str);
- Linux使用curl 方式安装docker-compose 后执行docker-compose version 检查安装是否成功时出错的解决办法
0x0.缘起: 今天在一台新的Fedora 25上按照官方文档,使用curl方式安装 docker-compose后,验证是否安装成功时出错: 安装时使用的命令为; curl -L https://g ...
- 游戏行业DDoS攻击解决方案
行业综述 根据全球游戏和全球移动互联网行业第三方分析机构Newzoo的数据显示:2017年上半年,中国以275亿美元的游戏市场收入超过美国和日本,成为全球榜首. 游戏行业的快速发展.高额的攻击利润.日 ...
- 基于Spring aop写的一个简单的耗时监控
前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...
- ASP.NET MVC 右键点击添加没有区域(Area)、控制器、试图等选项
在MVC项目中准备添加控制器.区域时发现没有控制器这个选项,当时没有在意以为VS出问题了,网上所搜了一下,有人说没有安装:Microsoft.AspNet.Mvc或者需要升级. 本次的解决如下: 1) ...
- 【资料下载区】【GK101固件】更新日期2017/1/11
<GK101任意波发生器>升级固件发布(版本:1.0.2build539)<GK101任意波发生器>升级固件发布(版本:1.0.2build851)<GK101任意波发生 ...
- NO.1 hadoop简介
第一次接触这个时候在网上查了很多讲解,以下很多只是来自网络. 1.Hadoop (1)Hadoop简介 Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层 ...