Find

The Find module supports the top-down traversal of a set of file paths.(一系列文件的路径的遍历)

find(*paths, ignore_error: true)

prune()

require 'find'
IGNORE = [/^\./, /^\.svn$/, /^\.git$/]
def listdir(top)
  Find.find(top) do |path|
    if FileTest.directory?(path)
      dir, base = File.split(path)
      IGNORE.each do |re|
        if re =~ base
          Find.prune
        end
      end
      puts path
    end
  end
end
listdir("ARGV[0]")

我直接输入目录名字,老是说没有这个目录,文件。?


Enumerable#reduce

reduce(initial) { |memo, obj| block } → obj
reduce { |memo, obj| block } → obj

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关键字都可以。

class Foo
  def a; end
  # call 'a' with explicit 'self' as receiver
  def b; self.a; end
  # call 'a' with implicit 'self' as receiver
  def c; a; end
end
def safe_send(receiver, method, message)
  # can't use 'send' because it bypasses visibility rules
  eval "receiver.#{method}"
rescue => e
  puts "#{message}: #{e}"
else
  puts "#{message}: succeeded"
end
visibility = ARGV.shift || "public"
Foo.send(visibility, :a)
foo = Foo.new
safe_send(foo, :a, "explicit receiver       ")
safe_send(foo, :b, "explicit 'self' receiver")
safe_send(foo, :c, "implicit 'self' receiver")

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=dataformatter=formatterenddefoutputputsself.formatter.output(self.data)endendclassXMLFormatterdefoutput(data)"<data>#{data}</data>"endendclassJSONFormatterdefoutput(data)"{ data: #{data} }"endendformatter=AwesomeFormatter.new("ihower",XMLFormatter.new)formatter.output()# 输出 XML 格式 <data>ihower</data>
formatter.formatter=JSONFormatter.new# 动态更换不同的输出策略formatter.output()# 输出 JSON 格式 

参考

  • 面向对象设计实践指南: 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? : !selfend
end
[1,2,3].blank? # false 
"blah".blank? # false 
"".blank? # true
nil.blank? # true

解释:Object#respond_to? (:symbol)是看receiver是否对method回应,返回boolean. 数组和字符串都有empty?方法. nil是个伪变量,没有方法。它的!self就是true

转载于:https://www.cnblogs.com/chentianwei/p/8607894.html

3-20 标准库:find库; 学习编程语言3节课(大多是旧识,全*栈)3-21 面向对象. Percent Strings; 元编程和Rails的相互理解...相关推荐

  1. python全栈计划_Python 全栈学习视频教程,包含了从 0-99天的全栈学习计划,估计可以学习 1024 小时。...

    今天跟大家推荐某大厂出 Pthon\Mysql\Linux 神器,据说是大厂内部大神分享的资料,不论是资料的详细程度和质量,都非常稀有! 我们知道,不论是高级开发和运维工程师,Linux 命令熟练程度 ...

  2. python学习(第二节课)

    一.列表添加元素的几种方法 [1,2,3]+[4,5,6]=[1,2,3,4,5,6]------直接两个列表相加 x.append(v)-------直接列表尾部添加单个元素v x=[1,2,3] ...

  3. 关于深度学习,我们写了一本1400页的全栈手册

    不知不觉写文章已经四年了.最开始是一个人,后来恰了恰饭,就招揽了很多比小夕厉害的小伙伴一起写.不知不觉已经积累了300多篇了.. 三年以来,我跟小伙伴们原创的300+篇深度学习与NLP领域的入门资料. ...

  4. python基础课程学习笔记-第二节课

    1.Python语⾔ 1.1 Python语⾔的基本概念 Python 是⼀种极少数能兼具 简单 与 功能强⼤ 的编程语⾔.你将惊异于发 现你正在使⽤的这⻔编程语⾔是如此简单,它专注于如何解决问题,⽽ ...

  5. c++基础学习 (第一节课)

    一.new和delete 一.介绍 new:关键字,申请内存 delete:关键字,释放内存 二.使用和特点 一.new的使用 /*new的使用*///申请内存//1事情单个内存(一个自己所需要的大小 ...

  6. 全栈公开课(深入浅出现代Web编程)学习——Part0-Web 应用的基础设施

    0. 介绍 课程简介: 这个课程是由芬兰的赫尔辛基大学计算机科学系推出的, 主要是介绍如何使用JavaScript开发现代Web应用程序. 课程的重点是使用ReactJS构建单页面应用程序(SPA), ...

  7. web全栈工程师(前端进阶)学习线路图

    近两年关于"前端工程师坚守前端还是主攻全栈开发"的问题,成为很多编程爱好者热议的话题.全栈开发工程师的概念最早是由Facebook提出的.全栈的核心是指开发者能够承担包括前端.后端 ...

  8. 全栈深度学习第7期: 研究方向这么多,哪些是有有趣又潜力的呢?

    一起追剧鸭 简介 Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目,通过微信群为同期追剧的小伙伴提供交流平台.关于该计划的详请见这里. Berkeley深度学习追剧群 目 ...

  9. 全栈深度学习第6期: 模型测试和部署

    一起追剧鸭 简介 Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目,通过微信群为同期追剧的小伙伴提供交流平台.关于该计划的详请见这里. Berkeley深度学习追剧群 目 ...

最新文章

  1. Stream流与Lambda表达式(三) 静态工厂类Collectors
  2. cd linux盒上盖子不休眠,CDLinux 自动休眠功能的关闭方法
  3. js仿QQ中对联系人向左滑动、滑出删除按钮的操作
  4. 一个小小的String问题引发的血案
  5. C语言内存编址和寻址、内存对齐
  6. EasyNetQ介绍
  7. day5-shelve模块
  8. MongoDB的基本shell操作(三)
  9. mysql删除中继日志_mysql 中继日志删除可以自动获取吗
  10. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——A题 切蛋糕
  11. python播放音乐同步歌词_Python点阵字玩转动态歌词
  12. Qt导航栏 QListWidget
  13. Vj程序设计作业H5
  14. c语言硬币大小,C语言抛硬币
  15. AXI_DMAC的寄存器说明
  16. win10 安装 SqlServer2008 亲测可行
  17. MySQL 数据类型
  18. day06--java高级编程:多线程,枚举类,注解,反射,网络通讯
  19. 声源分离算法性能评估指标SIR、SDR、SAR
  20. 【原创】老谷项目管理MSN群6.23记录

热门文章

  1. oracle数据库exp权限,exp/imp 权限问题及其知识拓展
  2. 计算机动画制作过程原理,计算机制作动画的基本原理及运动规律.ppt
  3. 凭证反过账 金蝶k3_建议收藏!金蝶快捷键操作大全!
  4. ad18修改过孔和走线间距_PCB设计之“过孔”
  5. php定时发送生日模块消息_RabbitMQ之消息的可靠性投递
  6. pythoncad图纸文件管理系统为用户_SafeShare通用CAD图纸文件管理软件6用户免费使用版...
  7. linux下看io等待时间,Linux下用iostat探测IO使用情况
  8. Ubuntu 配置Samba 服务器
  9. java 设置mysql 密码_Mysql修改设置root密码的命令及方法
  10. mysql数字辅助表_关于数字的经典SQL编程问题:数字辅助表