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. PHP扩展Redis编译安装

    PHP扩展Redis编译安装 1.下载PHP官方Redis源码包  wget http://pecl.php.net/get/redis-2.2.4.tgz  注:我用的是Redhat系统,ubunt ...

  2. 苹果搜索广告后台大揭秘,最全最细致详解,手把手设置教程「后附官方视频」-b

    WWDC2016 搜索广告分会视频和 PPT 发布了,ASO100 带开发者第一时间了解 Search Ads 后台设置(文末有原声视频). 首先介绍一下搜索广告的模式和竞价规则 广告模式为 CPT( ...

  3. 打log

    如果项目上过线的话,那你一定知道Log是多么重要. 为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出 ...

  4. mvc4 to mvc5 and EF5 to EF6

    今天把 后台的mvc 升级到了mvc5和ef6 .出错很正常. 下面是一些错误信息. [A]System.Web.WebPages.Razor.Configuration.HostSection 无法 ...

  5. bzoj 1004 1004: [HNOI2008]Cards burnside定理

    1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1668  Solved: 978[Submit][Stat ...

  6. Jinja2学习笔记暨官方文档的翻译

    http://blog.csdn.net/lgg201/article/details/4647471 呵呵, 刚刚看完Python模板引擎Jinja2的文档, 感觉很好, 觉得动态语言真是很好.  ...

  7. 用JQUERY的deferred异步按顺序调用后端API

    花了两天啊,想办法. 顺便,DJANGO分页的东东也熟悉了下. 如果不用最新的deferred这个东东,那我们以前传统的链式异步调用代码很难看,且长. 以下这个东东未作优化代码封装. this的参数用 ...

  8. 【Windows 8】pid为4的system进程占用80端口的解决办法

    因为Apache无法启动的原因,用netstat命令查看了一下80端口是否被占用了,如下: C:\Users\Maple>netstat -ano | findstr TCP LISTENING ...

  9. 我的第一份vim程序

    vim太好用了吧!!!根本停不下来啊! devc++再见! /*==================================================================== ...

  10. Microsoft Internet Explorer 内存破坏漏洞(CVE-2013-3193)(MS13-059)

    漏洞版本: Microsoft Internet Explorer 6 - 10 漏洞描述: BUGTRAQ ID: 61678 CVE(CAN) ID: CVE-2013-3193 Windows ...