Spell,也称pattern,idiom


# Around Alias:从一个重新定义的方法中调用原始的,被重命名的版本。
# old_reverse是未改变的原始方法,reverse/new_reverse是改变的方法。
class String
  def new_reverse
    "x:#{old_reverse}"
  end
  alias_method :old_reverse, :reverse
  alias_method :reverse, :new_reverse
end
puts "abc".reverse    #x:cba

# Blank Slate:移除一个对象的所有方法,以便把它们转换成ghost method
class C
  def method_missing(name, *args)
    'a Ghost Method'
  end
  p ancestors      #[C, Object, Kernel, BasicObject]
end
puts C.new.to_s  #返回一个string记录了对象的类和encoding-id#<C:0x00007f9ef0006950>
class D < BasicObject
  def method_missing(name, *args)
    "a Ghost Method"
  end
end
blank_slate = D.new
puts blank_slate.to_s    #返回method_missing方法的return: a Ghost Method

# Class Extension: 通过向singleton class中加入Module来定义class method,是对象扩展的一个特例
class C; end
module M
  def my_method
    'a class method'
  end
end
+ 1) # prints "method"
# Self Yield: 把self传给当前block
class Person
  attr_accessor :name, :surname
  def initialize
    yield self
  end
end
joe = Person.new do |p|
  p.name = 'Joe'
  p.surname = 'Smith'
end
p joe #=>#<Person:0x00007fdc560042b0 @name="Joe", @surname="Smith">

Ruby中有不少方法也是自动把receiver传入块。如:instance_eval ,class_eval, Object#tap


# Singleton Method:

给一个对象定义一个单例方法,也可以extend一个模块。

class Klass
end
k = Klass.new
class << k
  def hello
      "Hello from Mod.\n"
  end
end
p k.hello

# String of code

执行一段表示Ruby代码的字符串

my_string_of_code = "1+1"
p eval(my_string_of_code) #=》2

# Symbol To Proc
# 把一个调用单个方法的块转换成一个符号,一样的写法,目的是更省事

p [1,2,3].map{|x| x.even? }

p [1,2,3].map &:even?.to_proc   #变成proc对象,然后再用&变成代码块

p [1,2,3].map(&:even?)

#=> [false, true, false]

3-18/19 (自我练习)30多个《Ruby元编程》的spell(pattern)小例子。的更多相关文章

  1. 18.如何自我Struts2它Struts2标签和综合汇总文章有点早

    18.如何自我Struts2它Struts2标签和综合汇总文章有点早[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: h ...

  2. NVIDIA-docker报错:docker-ce (= 5:18.09.0~3-0~ubuntu-xenial) but 18.06.0~ce~3-0~ubuntu is to be installed

    报错: The following packages have unmet dependencies: nvidia-docker2 : Depends: docker-ce (= 5:18.09.0 ...

  3. 手动编译部署LNMP环境(CentOS7.5+Nginx-1.18.0+MySQL-5.7.30+PHP-7.4.14)

    在平时运维工作中,经常需要用到LNMP应用框架.LNMP环境是指在Linux系统下,由Nginx + MySQL + PHP组成的网站服务器架构. 可参考前面的文章: 如何在CentOS 7上搭建LA ...

  4. 毕向东_Java基础视频教程第19天_IO流(18~19)

    第19天-18-IO流(流操作规律 - 1) 通过三个步骤来明确"流操作"的规律: 明确数据流的"源和目的" 源, 输入流: InputStream/Reade ...

  5. 《C程序设计语言》练习 1-8,1-9

    #include <stdio.h> /*编写一个统计空格,制表符与换行符个数的程序*/ main() { int a,b,c,d;//a表示空格个数,b表示制表符个数,c表示换行符个数 ...

  6. 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  7. Ubuntu vim+ ctags(包含系统函数) + taglist 配置 分类: vim ubuntu 2015-06-09 18:19 195人阅读 评论(0) 收藏

    阅读大型代码,我们经常需要打开很多的代码文件,搜索各种定义.windows下用惯了ide的朋友,转战Linux的时候可能会觉得很难受,找不到合适的阅读工具.其实万能的vim就可以实现.下面介绍一下vi ...

  8. Fedora 18/19没有注销

    sudo yum install dconf-editor -y 定位到org > gnome > shell  勾选always-show-log-out http://www.ryan ...

  9. codeforces 702C Cellular Network 2016-10-15 18:19 104人阅读 评论(0) 收藏

    C. Cellular Network time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

随机推荐

  1. iOS 绘图 (UIImage的一些操作)

    UIGraphicsBeginImageContextWithOptions,本文主要在图片类型上下文中对图片进行操作,具体实现的功能:  - 1.生成图片  - 2.绘制图片到视图 - 3.添加水印 ...

  2. 持续集成之四:Jenkins+sonarqube

    参考其他文章,编译 构建 检查工具 参考:https://blog.csdn.net/lswnew/article/details/79193529 http://www.uml.org.cn/cod ...

  3. python 文件操作,os.path.walk()的回调函数打印文件名

    #coding=utf-8 import osdef find_file(arg,dirname,files):    #for i in arg:        #print i for file ...

  4. 升级到php7相关问题,日请求过亿QQ会员活动平台PHP7升级实践

    升级到php7相关问题,日请求过亿QQ会员活动平台PHP7升级实践 日请求过亿:QQ会员活动平台PHP7升级实践http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4 ...

  5. 有趣的js匿名函数写法(function嵌套)

    例子没有什么实际意义,只能做为思路参考 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo ...

  6. Centos下安装git高版本2.1.2

    安装依赖软件 # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc # yum in ...

  7. Git 的安装步骤

    Git 的安装步骤 一.下载Git Git 的官网:https://git-scm.com/ 在 Git 的官网中点击Downloads,进入如下页面: 选择对应的操作系统,以博主为例,点击Windo ...

  8. Linux中tomcat日志按日期自动分割

    Linux中tomcat日志分割需要用到cronolog 附上cronolog-1.6.2.tar.gz 1. 安装cronolog tar –zxvf cronolog-1.6.2.tar.gz . ...

  9. Python3基础 os.path.splitext 处理文件名,得到文件名+扩展名

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. POJ 1845 Sumdiv(求因数和 + 逆元)题解

    题意:给你a,b,要求给出a^b的因子和取模9901的结果. 思路:求因子和的方法:任意A = p1^a1 * p2^a2 ....pn^an,则因子和为sum =(1 + p1 + p1^2 + . ...