1.block 代码块

do...end 或 {} 构成一个代码块,就像常见的 .each后面跟的代码块、

my_nums = [1,2,3]
my_double_nums = my_nums.collect {|num| num*2}
puts "#{my_double_nums}" #=> [2,4,6]

collect能作用在Array的每个元素上,也支持collect! 操作,即改变数组本身。map! 和 collect! 作用相同

yield关键字 yield能够在方法内调用 block,这也是为什么有一些方法能接受一个block而另一些不行。

Why do some methods accept a block and others don't? It's because methods that accept blocks have a way of transferring control from the calling method to the block and back again. We can build this into the methods we define by using the yield keyword

yield也能接受参数

def yield_name(name)
puts "In the method! Let's yield."
yield name
puts "Block complete! Back in the method."
end
yield_name("Eric") { |name| puts "My name is #{name}." }

2.Procs 使得我们能复用block

Ruby中“一切皆对象”。但是,Blocks却不是对象,所以我们需要使用procs去“存储”block。

Procs使得你的代码符合DRY-Don't Repeat Yourself特性。

multiples_of_3 = Proc.new do |n|
n % 3 == 0
end
(1..100).to_a.select(&multiples_of_3)

&用来将multiples_of_3转换成block。当把带有&符号的参数传给方法时,会被认出是block、

将block "save"成procs有两个主要好处:1.procs是objects,所以具有objects的能力。2.复用

然而,你始终要记得,在Ruby中去做某些事时,总是有不止一种方法。所以,有另外的方法去调用procs:call关键字

hi = Proc.new { puts "Hello!" }
hi.call

另外,symbol能当做函数名的引用去传递一个函数,symbol前加&也能转换成procs

numbers_array = [1, 2, 3]
strings_array = numbers_array.map(&:to_s)
#=> ["1","2","3"]

3.Lambda

与procs类似,lambdas也是对象。他们的相似之处不止于此:除了语法上的一点不同和各自某些特殊的行为,两者是几乎一样的。

lambda {puts "Hello!"}  和 Proc.new {puts "Hello!"}  是一样的
def lambda_demo(a_lambda)
puts "I'm the method!"
a_lambda.call
end
lambda_demo(lambda { puts "I'm the lambda!" })
Lambda vs. Procs
 首先,lambda会检查传递给它的参数,然而procs不会。这就意味着如果你传递给lambda的参数个数不对,它就会抛出一个错误,而proc将会忽略多余的参数并讲缺少的参数赋值为nil。
  其次,当lambda返回(用return)时,它将控制权传回给方法;而当proc返回(用return)时,是不会回到方法内继续执行在它后面的代码的。
my_array = ["raindrops", :kettles, "whiskers", :mittens, :packages]
symbol_filter = lambda{|item| item.is_a? Symbol}
symbols = my_array.select(&symbol_filter)

4.简单的总结

Block是在do..end 或者 {} 之间的一些代码。它自己本身不是对象,但它可以传给像 .each 或 .select 这样的方法;
Proc能够“保存”block,得以让我们能够复用它;
Lambda跟Proc十分像,但它关心传递给他的参数个数,并且在return时能够返回到调用它的方法里(继续执行后面的代码),而不是直接也将这个方法一起return了。

5.Class

命名规范:首字母大写,驼峰
Instance variables @var  类的实例的变量
Class variables       @@var  类的变量(所有实例都拥有同一份拷贝)
Global variables      有两种方法:1.定义在方法或类的外面(实测,即使定义在外面,若想在方法内部使用也要加$啊)。 2.若定义在方法或类内部,用$

定义类内部静态方法  
def self.func; end  或者
def ClassName.func; end
构造函数
del initialize ... end


Inheritance  继承 语法:
 class DerivedClass < BaseClass    #Some stuff!   end
 Override.       super
 只能有一个父类

访问控制 Ruby中默认是Public
class ClassName
public
def public_method; end
private
def private_method; end
end
attr_reader :name  #定义get方法    ;   attr_writer :name #定义set方法    ;  attr_accessor :name #前两者都包含
class Person
attr_reader :name #name的get方法
attr_writer :age #age的set方法
attr_accessor :gender #gender的getter和setter #age的get方法,同 attr_reader :age
def age
@age
end #name的set方法,同 attr_writer :name
def name=(value)
@name = value
end
end
经测试,在使用 person = new Person; person.name="abc"时, person.name = "abc"也可以 =号不跟在name后面
6.Module 命名规范同class    Module跟类很像,但是不能创建实例,不能有子类。
 Module中适合定义常量。使用Module的一大目的就是分隔方法和常量。这叫 namespacing。例如: Math::PI  ; Circle::PI
 scope resolution operator  ::  作用域操作符.   访问module中的变量和方法都可以用这个操作符
Module中定义方法,如类中的静态(我认为的静态)方法(Class Methods),使用 def module_name.func;end  或者 def self.func; end
ruby中 .self 指代当前object
require 'module'
include 'module' 
When we include a module that has already been required, we pull in all its methods and constants at the instance level. That means that any class that includes a certain module can create objects (instances) that can use those very same methods!
include之后,可以直接使用module的方法和常量,而不用加 module_name::  
mixin 
When a module is used to mix additional behavior and information into a class, it's called a mixin. Mixins allow us to customize a class without having to rewrite code
module有点类似 Interface,可以被多个类include
extend 跟include相反,mixes a module's methods at the class level. This means that class itself can use the methods, as opposed to instances of the class

Ruby学习笔记(二)的更多相关文章

  1. ruby学习笔记(1)-puts,p,print的区别

    ruby学习笔记-puts,p,print的区别 共同点:都是用来屏幕输出的. 不同点:puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号):另外如果内容参数中有转义符,输出时将 ...

  2. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  3. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  4. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  5. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  6. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  7. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  8. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  9. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  10. Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. hibernate映射

    三种方式:     持久化注解   目前开发主流方式     XML配置描述文件(XML deployment descriptor,可以让Hibernate的PO类与JPA实体类兼容,实际中很少用) ...

  2. destoon代码从头到尾捋一遍

    destoon® B2B网站管理系统(以下简称destoon)由西安嘉客信息科技有限责任公司独立研发并推出,对其拥有完全知识产权,中国国家版权局计算机软件著作权登记号:2009SR037570. 系统 ...

  3. js&&node set_cookie、get_cookie

    js: function set_cookie(key, val,now){ var exdate = new Date(now); exdate.setDate(exdate.getDate() + ...

  4. Python环境搭建中解决C编译的问题

    下载必要文件 Python Microsoft Visual C++ Compiler for Python 2.7 setuptools 安装Python 安装VCForPython27 在命令行下 ...

  5. 在Docker下部署Nginx

    在Docker下部署Nginx 在Docker下部署Nginx,包括: 部署一个最简单的Nginx,可以通过80端口访问默认的网站 设置记录访问和错误日志的路径 设置静态网站的路径 通过proxy_p ...

  6. Java 内存区域和GC机制--备用

    Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 ...

  7. objective-C: nonatomic retain copy assgin 等属性详解

    http://my.oschina.net/u/728866/blog/90798 property,可以提供的功能有:提供成员变量的访问方法的声明.控制成员变量的访问权限.控制多线程时成员变量的访问 ...

  8. java怎么连接sql server,需要注意的几点

    一.JAVA连接SQL的语句    JAVA连接SQL2000语句为:  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  Drive ...

  9. 下一代hadoop

    1,hadoop 2.0 产生背景2,hadoop 2.0 基本构成3,HDFS 2.04 YARN5 MapReduce On YARN6 Hadoop 2.0初体验7 总结 1,hadoop 2. ...

  10. cademy的Java习题做后感

    在cademy各种语言的hello world也做了不少,好像都差不多,先是数据类型,然后条件语句,之后面向对象,再上几个特殊对象. 以前都没有做笔记,导致ruby做完就忘光了,这次好歹写点什么,比如 ...