打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
笔记(Ruby Hacking Guide)
1. [1, "string", 2, ["nested", "array"]]
数组元素可以使用任意对象
arr=[1,2,"str",[1,2,4]]
p arr[3]   #输出[1,2,4]
p arr[-1]  #输出[1,2,4]
arr.each { |item|
p item
}
#输出1 2 "str" [1,2,4]

2. 在Ruby中,无论是变量还是常量,全都保持着引用(reference)。因此,将一个变量赋值给另一个变量时,不会发生复制。
Ruby变量的首字符表示变量的类型(作用域)。
以小写字母或下划线开头的表示局部变量。
变量名以大写字母开头的是常量
根据Ruby的变量命名规则,第一个字母决定类型。实例变量是“@”。
变量名以@@开头的就是类变量。
在程序的任何位置都可以对全局变量进行赋值和访问。变量名的第一个字符为$的就是全局变量
最初的赋值兼做变量声明,无需额外声明。变量是无类型的,因此,无论何种类型,都可以无差别的赋值

Str="HelloWorld"
Str="Yes"  # Str是常量,Ruby将抛出警告: warning: already initialized constant Str


3.对于条件表达式,只有两个对象——false和nil——为假,其余所有对象都是真。0和空字符串也是真
  if i <10 then
    p i
  end
  while i<10 do
    p i
  end
  
4. Ruby的类名与常量名是等价的。那么,与类名同名的常量是什么呢?实际上,就是这个类。在Ruby中,所有能操作的东西都是对象。
类自然也是对象。这种对象称为类对象。所有的类对象都是Class类的实例。 也就是说,创建新类对象的class语句,
其动作是将类对象赋值给一个与类同名的常量。另一方面,生成实例的操作是,访问这个常量,通过该对象调用方法(通常是new)

在方法执行过程中,通常会保留自己(方法调用的实例)是谁的信息,这个信息可以通过self得到。类似于C++或Java中的this。
使用this,Ruby将抛出异常  

有时需要对一个类进行特定的初始化。这时要修改的不是new方法,而是一个名为initialize的方法。它会在new的过程中调用。

5. 只能指定一个超类。看起来Ruby似乎是单一继承。但是,因为模块的存在让它拥有了与多重继承同等的能力。下面就来讨论一下模块。 
一言以蔽之,模块就是“无法指定超类,无法生成实例”的类。定义可以这样写。
然而它无法直接调用,因此不能创建实例。那么该怎么用呢?应该由其它类“include”这个模块。这样一来,就好像类继承自这个模块一样
module M  
  def myupcase( str )  
    return str.upcase()  
  end  
end  
  
class C  
  include M  
end  
  
p(C.new().myupcase("content"))  # 显示"CONTENT" 

M的定义必须在C的定义前面,否则将抛出异常

class Cls  
  def test()  
    return "class"   
  end  
end  
  
module Mod  
  def test()  
    return "module"   
  end  
end  
  
class C < Cls  
  include Mod  
end  
  
p(C.new().test())   # “class”? “module”? 
模块和类哪边更“近

6. 开头加上::,表示“这是一个定义在顶层的常量”。就像文件系统的路径一样。假设根目录下有个叫vmunix的文件。
在/下只写vmunix就可以访问它。而在全路径下就要写/vmunix。Const和::Const也是同样的关系。在顶层下,可以只写Const,
也可以按照全路径写::Const。   
class SomeClass  
  Const = 3  
end  
  
p(::SomeClass::Const)   # 显示3  
p(  SomeClass::Const)   # 同样显示3 


class C1        # ::C1  
  ConstC1="ConstC1";
  class C2     # ::C::C2
    ConstC2="ConstC2";
    class C3   # ::C::C2::C3
      ConstC3="ConstC3";
    end
  end
end
p ::C1::C2::ConstC2  #显示  ConstC2

7. 顶层、类定义语句内、模块定义语句内、方法体内,都有各自完全独立的局部变量作用域。
Ruby程序执行过程中,到处都设置了self。就连顶层和类定义语句中都有self。 
比如,顶层甚至也有self。顶层的self称为main。没什么奇怪的,它就是Object的实例。 
main仅仅是为了设置self而准备的,没有什么更深层的含义。 
因为顶层的self,也就是main,是Object的实例,所以,即便是在顶层也可以调用Object的方法。
而且Object包含了一个称为Kernel模块,其中定义了“函数风格的方法”,像p、puts。(图10)。
因此,即便在顶层也可以调用p和puts。

8. Ruby对于程序库的加载也全都是在执行时进行的。通常这样写。 
Ruby代码 
require("library_name")  
同看到的一样,require是一个方法。根本没有保留字。这样写的话,就在其所写的地方执行加载,执行就转移到那个程序库(的代码)。
因为Ruby中没有Java中包的概念,如果希望划分程序库名称的名字空间,就将文件分开放置到目录里。 

9. 使用模块作为名字空间
# net程序库的名字空间划分的例子  
module Net  
  class SMTP  
    # ...  
  end  
  class POP  
    # ...  
  end  
  class HTTP  
    # ...  
  end  
end  

10. singleton方法(singleton method) 
对象可以调用方法。可以调用的方法由对象的类决定。但是理想情况下,方法是属于对象的。
至于类,它的存在是为了省去多次同样方法的时间。 
实际上,Ruby有一种机制,可以为对象(实例)单独定义方法,无论它们的类是什么。这样写。 
Ruby代码 
obj = Object.new()  
def obj.my_first()  
  puts("My first singleton method")  
end  
obj.my_first()   # 显示My first singleton method  

众所周知,Object是所有类的超类。在这么重要的类中,不可能定义一个像my_first名称这样怪异的方法。 
obj是Object的实例。但是,obj却可以调用my_first方法。
也就是说,肯定在哪定义了这个与所属类完全没有关系的方法。这样为某个对象定义的方法称为singleton方法(singleton method)。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
第一章:Ruby语言最小化
Ruby变量作用域的类目录结构
c++基础语法(构造函数初始化列表)
浅析C#中的const与readonly异同
Ruby 面向对象知识总结
C 字符串
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服