3-20 标准库:find库; 学习编程语言3节课(大多是旧识,全*栈)3-21 面向对象. Percent Strings; 元编程和Rails的相互理解
Find
The Find module supports the top-down traversal of a set of file paths.(一系列文件的路径的遍历)
prune()
我直接输入目录名字,老是说没有这个目录,文件。?
Enumerable#reduce
reduce 的第一个参数 initial 是初始值,然后这个匿名函式依序走访容器,两个参数 memo 跟 obj,前者 memo 是前一次循环的回传结果。obj 是这次走访的元素。
例子:reduce
(1..3).inject { |sum, n| sum + n }
private 和 protected 有什么差别?
http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby
implict [ɪm'plɪsɪt]suggested or understood without being stated directly
an implicit receiver of self. 隐含的自己
private只能被an implicit receiver of self调用。obj调用一个public方法,并在这个public方法内部调用private方法,不要加self.
protected只可以被 receiver is self的对象调用。obj调用一个public方法,并在这个方法内调用protected方法,加不加self关键字都可以。
module 命名空间
pasting
module A
class B
end
end
这个被 module A 包起来的 class B,如果要使用它要用 A::B
如果 module A 已经定义过了,则可以这样写:
class A::C
end
假如在 module A 里面定义了一个跟最外层撞名的类,这时候如果要拿外层的类,需要加上 :: 符号:
class Person
end
module A
class Person
def foo
Person # 这个会是指 A::Person
::Person # 前面要加 :: 表示要拿最外层的 Person
end
end
end
模块也是类,所以可以有模块方法(类方法),写法一样。
名词释疑:方法的「接口(Interface)」指的是方法的名称和参数,方法的「实作(Implement)」指的是方法内实际要做的代码
面向对象的3个特点:
1.封装。方法的使用,只需知道接口,就可以用了,方法的实做不需要了解。
2.继承。父类定义的方法可以被子类继承。Ruby只支持单一继承,但可以使用模块混入。
3.多态。指不同形态的东西,有共同的特点,就当初同一类东西使用。
例子:
Strategy Pattern 范例:情境是我们想要设计一个通用的数据输出功能,并且允许我们随时可以抽换不同的输出方式,例如 XML 或 JSON。
思路:一个数据有格式和内容。内容不变,格式根据需要改变。
第一,定义一个数据存储类,存储data和formatter两个属性。
第二,定义2个格式类,每个类有不同的输出格式,但调用方法接口都是output(data)
第三,在数据存储类中定义output, 内容是根据格式不同调用各自的方法output.
第四,在实例化一个数据存储类时,格式属性使用格式类.new生成一个格式类的对象。
class AwesomeFormatter
attr_accessor :data, :formatter
def initialize(data, formatter)
@data = data
@formatter = formatter
end
def output
puts self.formatter.output( self.data )
end
end
class XMLFormatter
def output(data)
"<data>#{data}</data>"
end
end
class JSONFormatter
def output(data)
"{ data: #{data} }"
end
end
formatter = AwesomeFormatter.new( "ihower", XMLFormatter.new )
formatter.output() # 输出 XML 格式 <data>ihower</data>
formatter.formatter = JSONFormatter.new # 动态更换不同的输出策略
formatter.output() # 输出 JSON 格式 { data: ihower }
参考
- 面向对象设计实践指南: Ruby 语言描述 人民邮电,找最新版本english。
Percent Strings
%() string
%w() Array of string,例子 %w(1 2) => ["1", "2"]
%r() 正则表达式
元编程: define_method
class A
def self.define_my_method(x)
define_method("output_#{x}") do
puts "This is #{x}"
end
end
end
class B < A
define_my_method :foo # 定义 output_foo 方法
end
class C < A
self.define_my_method(:bar) # 完整的写法,类宏
end
B.new.output_foo # 输出 This is foo
C.new.output_bar # 输出 This is bar
在 Rails 很多这样的宣告背后,都是用 define_method 做出来的:
class Firm < ActiveRecord::Base
has_many :clients
has_one :account
belongs_to :user
end
# has_many 是 AciveRecord 的类方法(class method) # 其内容是动态定义出 Firm 的一堆对象方法(instance methods) firm = Firm.find(1)
firm.clients
firm.account
firm.user
直接复写 Class 的定义去修改行为,在 Rails 中常用这招来扩增原本 Ruby 的行为,例如:
blank? 方法。检查对象是否是nil或者空字符串,空数组。
class Object # 在 Ruby 中所有的类都会继承自 Object 这个类
def blank?
respond_to?(:empty?) ? empty? : !self
end
end
[1,2,3].blank? # false"blah".blank? # false"".blank? # truenil.blank? # true
解释:Object#respond_to?(:symbol)是看receiver是否对method回应,返回boolean. 数组和字符串都有empty?方法. nil是个伪变量,没有方法。它的!self就是true
3-20 标准库:find库; 学习编程语言3节课(大多是旧识,全*栈)3-21 面向对象. Percent Strings; 元编程和Rails的相互理解的更多相关文章
- 风炫安全WEB安全学习第二十七节课 XSS的防御措施
风炫安全WEB安全学习第二十七节课 XSS的防御措施 XSS防御措施 总的原则 控制好输入/输出 过滤:根据业务需求进行过滤,对email,手机号码这样的输入框进行验证. 转义:所有输出到前端的数据都 ...
- 风炫安全WEB安全学习第二十一节课 存储型XSS讲解
风炫安全WEB安全学习第二十一节课 存储型XSS讲解 存储型XSS演示 存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存 ...
- 风炫安全WEB安全学习第十七节课 使用Sqlmap自动化注入(一)
风炫安全WEB安全学习第十七节课 使用Sqlmap自动化注入(一) sqlmap的使用 sqlmap 是一个开源渗透测试工具,它可以自动检测和利用 SQL 注入漏洞并接管数据库服务器.它具有强大的检测 ...
- 风炫安全WEB安全学习第二十节课 反射型XSS讲解
风炫安全WEB安全学习第二十节课 反射型XSS讲解 反射性xss演示 原理讲解 如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞.通常,该页面会使用一个包含消息文本的参数, ...
- 风炫安全Web安全学习第十节课 数字型的Sql注入
数字型的Sql注入 风炫安全Web安全学习第十一节课 字符型和搜索型的sql注入 风炫安全Web安全学习第十二节课 mysql报错函数注入 风炫安全Web安全学习第十三节课 CUD类型的sql注入 风 ...
- APUE 学习笔记(四) 标准I/O库
1.流与FILE对象 unix I/O系统调用都是针对文件描述符的 标准C的I/O函数都是针对流(文件指针)的,我们使用一个流与一个文件相关联 2.缓冲 标准I/O库提供缓冲的目的就是尽可能减少r ...
- c++学习书籍推荐《超越C++标准库:Boost库导论》下载
<超越C++标准库Boost库导论>不仅介绍了Boost库的功能.使用方法及注意事项,而且还深入讨论了Boost库的设计理念.解决问题的思想和技巧以及待处理的问题.因此,本书是一本了解Bo ...
- [EntLib]微软企业库5.0 学习之路——第一步、基本入门
话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...
- 标准I/O库之缓冲
标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦. 标准I/O提供了三种类型的缓冲: (1) ...
随机推荐
- 20154312 曾林 Exp3 免杀原理与实践
20154312 曾林 0.写在前面 AV厂商检测恶意软件的方式主流的就三种: 基于特征码的检测 启发式恶意软件检测 基于行为的恶意软件检测 我们要做的就是让我们的恶意软件没法被这三种方式找到,也就是 ...
- 获取Android设备的唯一识别码|设备号|序号|UUID
如何获取一个能唯一标识每台Android设备的序号? 这个问题有很多答案,但是他们中的大部分只在某些情况下有效. 根据测试: 所有的设备都可以返回一个 TelephonyManager.getDevi ...
- Linux基础命令---swapon
swapon 在指定的设备上启用交换分区,使用的设备或文件由专用文件参数提供.它可以是”-L label”或”-U UUID”,以指示一个设备的标签或UUID.对swapon的调用通常发生在系统引导脚 ...
- [转载]onclientclick和onclick区别
OnClientClick是客户端脚本,一般使用javascript,在客户端,也就是IE中运行,点击后马上执行OnClick是服务器端事件处理函数,使用C#或者vb.net,在服务器端,也就是IIS ...
- adb shell 命令详解,android, adb logcat
http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...
- Linux 中的 grep 命令
一,grep命令有什么用 个人觉得grep命令就是一个对文本或输出进行匹配并控制输出的一个工具,看一下下面的参数,部分翻译了,有不对的地方,还请指正: grep --help 匹配模式选择: -E, ...
- 利用脚本kill掉进程, 语法:运行脚本+进程名
下面附上脚本, 权限需要附X执行 #!/bin/sh #pid kill thread for chenglee #if fileformat=dos, update fileformat=unix ...
- MySQL中INSERT的一般用法
原文链接:http://www.blogjava.net/midnightPigMan/archive/2014/12/15/421406.html MySQL中INSERT的一般用法 INSERT语 ...
- 20145334赵文豪《网络攻防》 MSF基础应用
实践目标 掌握metasploit的基本应用方式 掌握常用的三种攻击方式的思路. 实验要求 一个主动攻击,如ms08_067 一个针对浏览器的攻击,如ms11_050 一个针对客户端的攻击,如Adob ...
- JRebel for IntelliJ 热部署破解方法
1.打开idea,然后打开设置. 2.点击Plugins 3.重启之后点击 4.下载激活JRebel的插件,下载地址:https://github.com/ilanyu/ReverseProxy/re ...