`

ruby语言注意事项

    博客分类:
  • ruby
阅读更多

每一门语言都有其独特之处,今天我就来聊聊ruby的独特之处

1.ruby中除了nil为false,其他都为true

2.ruby中的string是可变的,string类中有一系列修改字符串的方法。例如[]= <<

   ruby中的数值对象是不可变的

3.ruby中的block

3.times { print "ruby }

#do end
1.upto(10) do |x|
  puts x
end

 

4.支持fluent APIs

5.ruby中方法的括号可以省略

--永远不要在方法名和圆括号直接加空格

--要么全部不加括号

--要么全加括号

6.先shebang在coding,shebang永远在第一行

7.字符串内插

8.ruby中array可变,且如果所有超出,返回nil而不是报异常

9.Hash中由于字符串是可变的,当字符串作为键时,被当做特殊对待,会建立私有拷贝。因为使用可变对象作为hash键有许多问题,入股以一个对象作为hash键,但是后来改变了该对象,那么hash表将被破坏。可考虑为可变对象生产私有拷贝或者调用freeze方法。修改之后使用hash类的rehash方法。建议使用symbol作为键。

10.Range对象,<=>操作符,返回-1 0 或者1

11.succ方法

"a".succ # return "b"

1.succ # return 2

 12.Range的成员关系

r = 0...100
r.include? 100 # false
r.member? 50 # true
r.include? 99.9 # true

 13.Symbols

14.内省

o = "123456"
o.class
o.superclass
o.instance_of? String
Object.superclass

x = 1
x.is_a? Fixnum # is_a equal ===
x.is_a? Integer
x.is_a? Numeric
x.is_a? Comparable
x.is_a? Object
x.is_a? BaseObject

o.respond_to? :"<<" # true if o has an << operator
o.respond_to? :"<<" and not o.is_a? Numeric
#关注类型而不是类

 15.相对判断

equal? # 是否同一个对象,永远不要重写,也可以通过比较object_id
a = "ruby"
b= "ruby"
a.equal? b # return false
a == b # return true

#hash值之间的相等性是通过==实现的,键的相等性是通过eql?,某些类不允许类型转化

# === case中的比较
# =~ 用于模式匹配 !~

# 类的对象之间除了定义相等性还可定义顺序性

 16.拷贝对象(clone and dup)

17.冻结对象

s = "ice"
s.freeze #无法自改对象,也无法添加方法
s.frizen?

s.upcase! # error

# 使用clone拷贝后的对象也是被冻结的,使用dup拷贝后未被冻结

 

18.污染对象

s = "abc"
s.taint
s.tainted? # true
s.upcase.tainted? # true
s[1,2].tainted? # true

s.untarint

# 一个tainted的对象clone或者dup后还是受污染的

 17.模块可以嵌套

18.kernel中定义的方法是全局函数,作为Object类的私有方法定义的

a[0] => a.[](0)
s + y => s.+(y)
# += ||= 比较常用

 

19.并行赋值情况

x, y, z = 1, 2, 3
x = 1, 2, 3 # x = [1,2,3]
x, = 1, 2, 3 # x = 1
x, y, z = [1, 2, 3] => x, y, z = 1, 2, 3

x, y, z = 1, *[2, 3] => x, y, z = 1, 2, 3

x, *y = 1, 2, 3 => x = 1, y = [2, 3]

x, (y, z) = a, b => x = a; y, z = b

 

20.求幂操作是右结合的

2**3**4 => 2**(3**4)
--20140707 P119

 

21.Enumerable模块

collect(同map,返回新的数组或其他),select(数组选取),reject(与select正好相反),inject(两个参数,累计值和迭代值)

data = [2,5,3,4]
sum = data.inject {|sum, x| sum+x}
floatprod = data.inject(1.0) {|p,x| p*x}
max = data.inject {|m,x| m>x ? m : x}

enum_for(:sym)

to_enum

外部迭代器(程序员控制迭代,例如next)与内部迭代器

 

22.yield

def sequence(n, m, c)
  i, s = 0, []
  while i<n
  	y = m * i + c
  	yield y if block_given?
  	s << y
  	i += 1
  end
  s
end

 

23.return,redo,next,break,retry,throw catch,raise,rescue,else,ensure

 

24.线程,纤程,连续体(后两者极少使用)

def readfiles filenames
  threads = filenames.map do |f|
  	Thread.new {File.read f}
  end

  threads.map {|t| t.value}
end
f = Fiber.new {
  puts "Fiber says Hello"
  Fiber.yield
  puts "Fiber says Goodbye"
}

puts "Caller says Hello"
f.resume
puts "Caller says Goodbye"
f.resume

25.方法、Proc、lambda、闭包(slosure)

&把一个普通的代码块转化为以Proc对象,如果在Proc对象前加&,那么该Proc将当做普通代码块使用。

 

26.专题:Proc和lambda

三种方法创建proc对象,Proc.new、proc、lambda(后两者都是kernel的类方法),lambda子面量 ->(好处是可以为参数设定默认值)

调用方法,call(参数列表)

=================================

Proc对象有一个arity方法,用于返回期望的参数个数

相等性,有相同的代码块,不意味着相等,应该是克隆或者复制品时,才相等

区别:

proc更像是代码块,而lambda更像是方法

lambda中的return仅从自身返回,而proc不是

lambda会进行参数校验

=================================

proc和lambda都是闭包

Binding对象

 

27.Method对象(很少使用),方法name、owner、receiver

调用,使用call或者[]

区别:Method对象不是闭包

 

第七章:类和模块 p228

 拷贝:dup、clone、initialize_copy

marshal_dump

marshal_load

 

28.单键------仅仅拥有一个实例的类,常用来存储全局程序状态,可以用来替代类方法和类变量

ruby中有点特别的是如果给某个对象加了一个方法,那么他也是单键方法

new和allocate必须私有,必须阻止dup和clone产生新的拷贝。

 

Singleton模块

所有的类都是模块

如果一个模块定义了若干实例方法,而不是类方法,这些方法可以混入类中------include

模块中混入模块Module.include Object.extend

 

29.加载路径

$LOAD_PATH or $:

方法查找:o.m为例

先在o的单键中查找--》实例方法--》在包含的所有模块中按照被引入的顺序逆序查找--》超类查找并重复步骤--》method_missing

类方法查找

先在o的单键中查找--》在包含的所有模块中按照被引入的顺序逆序查找--》超类查找并重复步骤--》method_missing

常量查找:

在包含语句中(即模块或类中)--》在包含的所有模块中按照被引入的顺序逆序查找--》超类查找并重复步骤--》const_missing

 

第八章:反射和元编程

30.反射--内省也

o.class
o.superclass
o.instance_of? c
o.is_a? c
o.kind_of? c
c === o
o.respond_to? name #是否有name这个公开或者保护的方法


module A; end
module B; include A; end;
class C; include B; end;
C<B
B<A
C<A
Fixnum < Integer
Integer < Comparable
# ...
A.ancestors
C.ancestors
B.ancestors
String.ancestors

C.include? B
B.include? A

A.included_modules
B.included_modules



module Greeter; def hi; "hello"; end; end
s="string object"
s.extend(Greeter)
s.hi
String.extend(Greeter)
String.hi

module M
  class C
    Module.nesting # => [M::C, M]
  end
end

eval方法:

x = 1
eval "x+1"

binding对象:

Proc对象的binding方法

ruby1.9中Binding对象的eval方法,无需作为eval的第二个参数传入。

class Object
  def bindings
    binding
  end
end

class Test
  def initialize(x); @x = x; end
end

t = Test.new 10
eval("@x", t.bindings)

31.instance_eval class_eval

instance_eval为对象创建了一个单键方法,(是类对象时,成为类方法)

class_eval定义了一个普通的实例方法

两者与eval的主要区别是可以对代码块求值

 

32.instance_exec class_exec(module_exec)

instance_eval class_eval不同的是他可以接收参数

 

33.常量和变量

global_variables

local_variables

class_variables

instance_variables

constants

 

instance_variable_set

instance_variable_get

instance_variable_defined?

 

class_variable_set

class_variable_get

class_variable_defined?

 

constant_set

constant_get

constant_defined? #如果把false作为第二个参数传入,那么只在本类或者模块中查找

constant_missing

 

34.方法

methods

public_mithods

public_mithods false

protected_methods

private_methods

private_methods false

singleton_methods

 

instance_methods

instance_methods false

public_instance_methods

protected_instance_methods

private_instance_methods false

 

public_method_defined?

protected_method_defined?

private_method_defined?

method_defined?

respond_to?

 

方法调用:send--想对象发送一个消息,可以调用一个对象的任意有名方法,包括私有和保护的,第一个参数是方法名,后面的是该方法的参数

"hello".send :upcase
Math.send :sin, Math::PI/2

ruby1.9出现了public_send方法,区别是只调用公开方法

 

35.定义方法,取消方法,和别名方法

define_method # 是一个私有方法

def add_method c, m, &b
  c.class_eval {
    define_method m, &b
  }
end

add_method(String, :greet) { "hello, " + self }
"world".greet

定义单键方法在ruby1.9中可以使用define_singleton_method

 

alias plus +

alias_method

remove_method

undef_method

freeze

 

36.处理未定义方法

method_missing 强悍无比 const_missing

class Hash
  def method_missing key, *args
    text = key.to_s
    if text[-1,1] == "="
      self[text.chop.to_sym] = args[0]
    else
      self[key]
    end
  end
end

h = {}
h.one = 1
puts h.one

 

37.钩子方法

inherited

included

extended

method_added

singleton_method_added

method_removed

method_undefined

singleton_method_removed

singleton_method_undefined

 

38.跟踪

__FILE__

__LINE__

__method__

__callee__

SCRIPT_LINES__

 

kernel.trace_var来跟踪全局变量

 

39.ObjectSpace and GC

ObjectSpace.each_object(Class) {|c| puts c}
ObjectSpace.id2ref

ObjectSpace.garbge_collect强制ruby进行垃圾回收,或者GC.start

GC.disable

GC.enable

 

40.用同步代码块实现线程安全

两个线程不能同时修改同一个对象

解决问题方案一:将线程安全的代码放在调用一个Mutex对象的synchronize方法的代码块中,二是自实现模拟java中的synchronized关键字

 

41.动态创建方法

用class_eval创建方法

用define_method创建方法

 

42.领域特定语言 DSL

 

 43.网络编程

require 'socket'

host, port = ARGV

s = TCPSocket.open(host, port) do |s|
  while line = s.gets
  	puts line.chop
  end
 end
require 'socket'

server = TCPServer.open(2000)
loop {
  client = server.accept
  client.puts Time.now.ctime
  client.close
}

 

 

 

分享到:
评论

相关推荐

    Ruby 编程语言的书籍

    2. **陷阱与注意事项**:通过实际案例分析常见的错误和潜在问题,为读者提供宝贵的实践经验。 #### 五、总结 《The Book of Ruby》不仅是一本优秀的Ruby编程入门书籍,更是一部全面涵盖Ruby编程语言各个方面的重要...

    Ruby 语言教程从小白到入门

    本教程将引导初学者从零开始逐步掌握Ruby语言,让你从一个编程小白顺利过渡到入门阶段。 首先,Ruby的核心概念是面向对象编程(Object-Oriented Programming, OOP)。在Ruby中,一切都是对象,包括基本的数据类型如...

    Ruby-RubyonRails应用程序的安全注意事项清单

    Ruby on Rails(简称RoR)是一款基于Ruby语言的开源Web应用框架,以其高效、简洁和MVC(模型-视图-控制器)架构而受到开发者喜爱。然而,随着Web应用复杂性的增加,安全性问题也日益凸显。为了确保Ruby on Rails应用...

    Ruby编程语言中基础和高级控制结构详解

    内容概要:本文详细介绍了Ruby编程语言中的基础和高级控制结构,包括条件语句(if、...其他说明:本文不仅提供了丰富的示例代码,还解释了每个控制结构的使用场景和注意事项,是学习和掌握Ruby编程语言的重要参考资料。

    ruby中文 文档

    9. **线程和并发**:Ruby支持多线程,文档会解释如何创建和管理线程,以及并发编程的注意事项。 10. **Gem包管理**:Ruby的Gem系统是其生态系统的核心部分,文档会介绍如何安装、使用和创建Gem包。 11. **Ruby on ...

    ruby-1.8.7-p72-i386-mswin32.zip

    1. **README.1st**:这通常是一个包含软件基本信息、安装指南、许可信息和其他重要注意事项的文本文件。对于Ruby的安装和配置,这个文件会提供关键的指导。 2. **MANIFEST**:这个文件列出了压缩包内所有文件的完整...

    ruby metaprograming

    #### 五、元编程的注意事项 虽然元编程提供了强大的能力,但在使用时也需要谨慎,以避免潜在的问题: 1. **可读性和维护性**: 过度使用元编程可能会导致代码难以理解和维护。 2. **性能**: 动态生成代码可能会影响...

    Pragmatic.Programming.Ruby.1.9.Apr.2009.pdf

    作者提供了详细的步骤和注意事项,帮助读者顺利搭建Ruby开发环境。 ### 运行Ruby程序和文档查阅 书中详细讲解了如何在命令行下运行Ruby脚本,以及如何使用RDoc和ri工具来查阅Ruby文档。RDoc是Ruby的官方文档生成...

    ruby javatoc++

    1. **Ruby语言**:Ruby是一种面向对象的、动态类型的编程语言,以其简洁和可读性强的语法著称。它支持多种编程范式,包括面向对象、函数式和过程式编程。 2. **Java语言**:Java是一种广泛使用的、跨平台的编程语言...

    ruby on rails api

    开发者可以通过搜索特定的API,了解其功能、用法和注意事项,从而提高开发效率和代码质量。对于Ruby on Rails初学者和经验丰富的开发者来说,这样一份详尽的API文档都是不可或缺的学习和工作资源。

    ruby复制文件夹

    ### 注意事项 1. **权限问题**:在执行这些操作时,确保Ruby进程有足够的权限去读取源目录、创建和写入目标目录。 2. **保留元数据**:如果你需要复制文件的同时保留文件的权限、时间戳等元数据,可以考虑使用` ...

    Ruby加减乘除的案例

    #### 进阶技巧与注意事项 - **数据类型转换**:在本例中,通过`to_f`将输入转换为浮点数,可以支持小数运算。如果只需要整数运算,则可以改为使用`to_i`。 - **异常处理**:除了检查除数是否为零外,还可以添加更多...

    Ruby 安装 – Windows.docx

    本文将详细介绍在Windows系统上安装Ruby的全过程及相关注意事项。 #### 二、安装前准备 在开始安装之前,请确保您的Windows系统已经更新至最新版本,并且网络连接正常。这将有助于确保下载过程的顺利进行以及后续...

    ruby1.9.1文档和一本pdf

    8. **升级指南**:对于从旧版本升级到 1.9.1 的开发者,提供注意事项和迁移策略。 阅读这份文档和 PDF,不仅可以帮助你掌握 Ruby 1.9.1 的核心特性,还能提升你的编程技能,理解编程语言演进背后的设计理念。对于...

    ruby-1.8.2.tar.gz

    6. **注意事项**:由于`.tar.gz`包含的是源代码,所以需要相应版本的编译器和构建工具才能成功编译和安装。对于非开发者,可能需要依赖包管理器(如 apt-get 或 brew)来自动处理这些步骤。 通过上述介绍,我们可以...

    Game Programming with Python Lua And Ruby

    - 跨平台开发的注意事项和解决方案。 6. **实战项目演练**: - 通过几个实际项目来加深对理论知识的理解。 - 分析项目中的问题并提出改进方案。 综上所述,《Game Programming with Python Lua And Ruby》这...

    Ruby程序设计高级教程

    - Windows系统下的安装步骤和注意事项。 - Linux环境下Ruby的安装方法。 - **运行Ruby**: - 使用Ruby命令行的基本操作。 - IDE选择:FreeRIDE和SciTE等开发工具的使用技巧。 - fxri工具的介绍及其使用方法。 -...

    Metaprogramming Ruby

    “Metaprogramming Ruby”这一标题明确地指出了本书的核心内容——通过元编程技术深入探索Ruby语言的独特魅力。元编程(Metaprogramming)是一种在程序运行时能够修改或控制其行为的技术,这使得Ruby成为了一种高度...

    Ruby on Rails Bible.pdf

    在部署Rails应用到生产服务器之前,有许多事项需要注意。本章将讲述如何配置合适的服务器环境、选择适当的部署工具,以及如何确保应用能够在生产环境下稳定运行。 ### 附录A:附加资源 除了正文内容外,本书还提供...

    RubyCreator:用于向QtCreator IDE添加Ruby语言支持的插件

    插件将Ruby语言支持添加到QtCreator IDE。 可以在以下位置找到更多信息: : 如何安装 软件包仅适用于AUR中的Arch Linux,对于任何其他方面,您都需要克隆存储库并自己进行编译。 关于分支的注意事项 master分支应...

Global site tag (gtag.js) - Google Analytics