ruby-菜鸟入门教程

开发ruby的工具<a href="https://atom.io">Atom</a> for mac

运行ruby程序在Atom中的话,安装package Script,然后重启Atom
然后再Command + I 运行.注意一定要重启.

1. Click on Packages --> Commmand Palette --> Select Toggle.
2. Type Install Packages and Themes.
3. Search for Script and then install it.
4. Press Command + I to run the code (on Mac)

创造者:松本行弘

Ruby 是"程序员的最佳朋友"。
方便程序员,性能没有Java好

是开源的,在 Web 上免费提供,但需要一个许可证。
通用的、解释的编程语言。
真正的面向对象编程语言。
可以用来编写通用网关接口(CGI)脚本。
可以被嵌入到超文本标记语言(HTML)。
可用于开发的 Internet 和 Intranet 应用程序。
可以安装在 Windows 和 POSIX 环境中。
可以很容易地连接到 DB2、MySQL、Oracle 和 Sybase。

1.编译/执行 Ruby 程序

puts "Hello World!";

2.Ruby 中文编码

puts "你好,世界!";
输出: invalid multibyte char (US-ASCII) 

Ruby 使用用 ASCII 编码来读源码,中文会出现乱码
解决方法:
#!/usr/bin/ruby -w
# -- coding: UTF-8 -
- puts "你好,世界!";

3.Ruby的命令行选项

4.Ruby 语法

所有的 Ruby 文件扩展名都是 .rb

Ruby 程序中的空白

a + b 被解释为 a+b (这是一个局部变量)
a +b 被解释为 a(+b) (这是一个方法调用)

Ruby 程序中的行尾

Ruby 把分号和换行符解释为语句的结尾。但是,如果 Ruby 在行尾遇到运算符,比如 +-\,它们表示一个语句的延续。

Ruby 标识符

标识符是变量、常量和方法的名称。Ruby标识符是大小写敏感的。这意味着 RamRAMRuby 中是两个不同的标识符。

保留字

Ruby 中的 Here Document

"Here Document" 是指建立多行字符串。
<<之后,您可以指定一个字符串或标识符来终止字符串,且当前行之后直到终止符为止的所有行是字符串的值。

print <<EOF 这是第一种方式创建here document 。 
多行字符串。
EOF 
print <<"EOF"; # 与上面相同 
这是第二种方式创建here document 。 
多行字符串。
EOF 
print <<`EOC` # 执行命令 
echo hi there 
echo lo there
EOC 
print <<"foo", <<"bar" # 您可以把它们进行堆叠 
I said foo.
foo 
I said bar.
bar

Ruby BEGIN语句

puts "这是主 Ruby 程序" 
BEGIN { 
    puts "初始化 Ruby 程序"
}
// 先打印"初始化 Ruby 程序"

Ruby END语句

最后执行

Ruby 注释

单行注释:

#单行注释

多行注释:

=begin
多行注释
多行注释
=end

数据类型

Ruby支持Number,String,Ranges,Symbols数据类型,以及true,falsenil这几个特殊值

Number数值类型

  1. 整形Integer
    整形分为2种,31位以内Fixnum
    超过为Bignum
  2. 浮点型
    浮点数是Float类的对象.

算数操作

加减乘除指数: + - * / **

字符串类型

Ruby字符串简单地说是一个8位字节的序列,它们是String类的对象.
双引号标记的字符串允许替换和使用反斜线符号,单引号标记的字符串不允许替换,且只允许使用 \\\'两个反斜线符号.

转义符,\

Ruby表达式

#{expr}
i.e. 
puts "相乘 : #{24*60*60}"
// 结果为: 相乘 : 86400

字符串可以相加:

name = "Liao Maer"
puts name + ", Loving"
// -> Liao Maer Loving

数组

数组字面量通过[]中以逗号分隔定义,且支持range定义.

  1. 数组通过[]索引访问
  2. 通过赋值操作插入,删除,替换元素
  3. 通过+号进行合并和删除元素,且集合做为新集合出现
  4. 通过<<号向原数据追加元素
  5. 通过*号重复数组元素
  6. 通过&符号做并集和交集操作(注意顺序)
i.e.
ary = ["fred", 10, 10.2, "this can be help", "last element"]
ary.each do |i|
    puts i
end

哈希类型

哈希是在大括号内放置一系列键/值对,键和值之间使用逗号和序列=>分隔。尾部的逗号会被忽略。

hashs = colors = {"red"=> 0xf00, "green"=>0x0f0, "blue"=>0x00f}

colors.each do |key, value|
   print key, " is ", value, "\n"
end  

范围类型

一个范围表示一个区间.
范围(1..3)表示 1,2,3
范围(1...3)表示1,2

(10..15).each do |n|
    print n, ' '
end

类和对象

Ruby是一种完美的面向对象的编程语言.

  • 数据封装
  • 数据抽象
  • 多态性
  • 继承

定义类:

class Customer
end

使用关键字 end 终止一个类。 中的所有数据成员都是介于类定义和 end 关键字之间.

Ruby类中的变量

  • 局部变量
    方法中定义的变量,局部变量在方法外是不可用的。局部变量以小写字母_开始.
  • 实例变量
    实例变量可以跨任何特定的实例或对象中的方法使用.实例变量可以从对象到对象的改变。实例变量在变量名之前放置符号(@).
  • 类变量
    类变量可以跨不同的对象使用.类变量属于类,且是类的一个属性。类变量在变量名之前放置符号(@@)。
  • 全局变量
    类变量不能跨类使用.如果您想要有一个可以跨类使用的变量.您需要定义全局变量。全局变量总是以美元符号($)开始.
i.e.
class Customer
    @@no_of_customers=0
end

我们如果每次创建Customer的instance,可以让@@no_of_customers + 1
我们就可以统计有多少个Customer类的实例了

在Ruby中使用new方法创建对象

cust1 = Customer. new  // .后面有没有space效果都一样

自定义方法来创建Ruby对象

Ruby类中的成员函数

在ruby中,函数被称之为方法.类中的每个方法以关键字def开始,后面跟着方法名.
方法名总是以小写字符开头。在ruby中,可以用关键字end来结束一个方法.

class Sample
  def hello
    puts "hello, world"
  end
end

sample = Sample.new
sample.hello

Ruby类案例

class Customer
  @@no_of_customers=0
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end
  def display_details()
    puts "Customer id #@cust_id"
    puts "Customer name #{@cust_name}"
    puts "Customer addr #{@cust_addr}"
  end
  def total_no_of_customeers()
    @@no_of_customers += 1
    puts "Total number of customers:#{@@no_of_customers}"
  end
end

cust1 = Customer.new("1", "jack", "beijing")
puts cust1.display_details  // 可以省略`()`,也可以加上,一样的,为了简单便捷,可以不加

Ruby变量

变量是持有可被任何程序使用的任何数据的存储文位置.
Ruby支持5中类型的变量.

  • 一般以小写字符,下划线开头。变量
  • $ 开头,全局变量
  • @开头,实例变量
  • @@开头,类变量,类变量被贡献刚在整个继承链中
  • 大写字母开头:常数

Ruby全局变量

全局变量以$开头。未初始化的全局变量的值为nil。在是永久-w选项后,会发生警告.

Ruby的实例变量

实例变量以@开头

Ruby的类变量

类变量以@@开头,并且必须初始化后才能在方法中使用.
引用一个没有初始化的类变量会发生错误.类变量在他的类或者模块的子类或者字母快中可以共享使用.
在使用-w选项后,重载类变量会产生警告.

  1. 块由大量的代码组成。

  2. 需要给块取个名称。

  3. 块中的代码总是包含在大括号{}内。

  4. 块总是从与其具有相同名称的函数调用。这意味着如果您的块名称为 test,那么您要使用函数 test 来调用这个块。

  5. 可以使用 yield 语句来调用块。

    block_name{ 
        statement1 
        statement2 
        ..........
    }
    

yield

ie1.

def test
puts "in test method"
yield
puts "you back to test method"
yield
end

test {puts "you are in block"}

result:

in test method
you are in block
you back to test method
you are in block

ie2.

def test1
   yield (5)
   puts "在 test 方法内"
   yield (100)
end

test1{
    |i| puts "you are in #{i} block" 
}

result:

you are in 5 block
在 test 方法内
you are in 100 block

块和方法

通常使用 yield语句从与其具有相同名称的方法调用块.

def test 
    yield
end
test{ puts "Hello world"}

如果方法的最后一个参数前带有 &,那么您可以向该方法传递一个块,且这个块可被赋给最后一个参数。如果 *&同时出现在参数列表中,&应放在后面。

def test(&block) 
    block.call
end
test { puts "Hello World!"}
#输出: Hello World!

BEGIN 和 END 块

每个 Ruby源文件可以声明当文件被加载时要运行的代码块(BEGIN块),以及程序完成执行后要运行的代码块(END块)

Ruby的模块

模块(Module)是一种把方法、类和常量组合在一起的方式。

  • 模块提供给了命名可敬避免名字冲突
  • 模块实现了mixin装置
  • 模块不能被实例化
  • 模块没有子类
  • 模块只能被另一个模块定义

实例:

module Trig 
    PI = 3.141592654 
    def Trig.sin(x) 
    # .. end 
    def Trig.cos(x) 
    # .. end
end

就像类方法,当您在模块中定义一个方法时,您可以指定在模块名称后跟着一个点号,点号后跟着方法名。

Ruby的require语句

require语句类似于 CC++中的 include 语句以及Java中的 import语句。

使用 Ruby require 语句来加载模块文件

文件引用:

$LOAD_PATH << '.'  # 让ruby知道必须在当前目录中搜索被引用的文件
require 'trig.rb' 
require 'moral'  # .rb 不是必须的
y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容