Ruby历史Ruby被许多人认为是一种“新”编程语言,但实际上是由一个叫作Matz的开发人员于1994年发布的。 Matz自我描述是一个“语言极客”,也是Perl大粉丝。 他对Ruby的想法是创建一种像Perl这样灵活而强大的语言,但在其语法上更具表现力 - 甚至可以具有类似于英语那样的可读性。 Ruby在日本迅速成长,直到2000年,真的没有关于除了日本语言以外的任何文档。所以如果想要学习Ruby,那得必须先学习日语。 敏捷编程的先驱Dave Thomas被Ruby迷住,并决定创建Ruby的其它语言文档。 自Ruby有了英文开始,Ruby就开始在英语世界中增长,尽管缓慢。 系统管理员变得流行,编写维护和“粘贴”脚本 - 类似Perl的用法。从2000年到2005年美国的Ruby社区已达数百个。 在2004-2005年,一家名为 当建立了Basecamp,DHH就会从中提取出Web框架。 这是一个非常不同的方法,从 这种方法是一个很大的打击,Rails自从以来一直推动了Ruby/Rails社区的发展。 现在,在亚马逊上有数十本书,全球近一百个会议,有成千上万的人是Ruby/Rails开发人员。 如果你想学习Rails,需要先学习Ruby! 现在就开始咯 ….. 1. Ruby解释器Ruby是一种“解释”的编程语言,它不能直接在处理器上运行,它的代码必须馈送到称为“虚拟机”或虚拟机的中间件。 虚拟机的一方面是Ruby代码,另一方面则是操作系统和处理器。 这种方法的好处是您可以编写一次Ruby代码,就可以在许多不同的操作系统和硬件平台上执行了。 Ruby程序无法运行自己的程序,它需要加载虚拟机。 使用VM执行Ruby的方式有两种:通过 从命令行运行Ruby代码这是编写Ruby代码的耐用方法,因为要将指令保存到文件中。 该文件可以备份,传输,添加到源代码管理等。 一个Ruby代码文件示例 这里创建一个名称为: #!/usr/bin/ruby # filename : first-ruby.rbclass Sample def hello puts 'Hello, World!' endends = Sample.news.hello Ruby 那么可以这样运行程序: 当您运行 从IRB运行Ruby代码Ruby是第一批语言推广所谓“ IRB最好用作实验的便笺簿。 许多开发人员在编写他们的“真实”程序时,一般都保持IRB窗口打开,使用它来记住某个方法如何工作或用于调试某个代码块。 要打开IRB进行实验,可通过打开终端(Mac)或命令提示符(Win)并打开或输入
2. Ruby变量编程都是要创建抽象的代码来描述和处理数据,要创建抽象,必须要为在代码中分配名称来表示事物。 变量只不过是为数据创建一个名称的一种方式。 创建和分配变量在某些语言中,需要在为一个变量分配值之前声明这个变量。 当为变量分配值时,会自动创建Ruby变量。下面来试试一个例子:
右边优先 在英文表达式中,是从左到右阅读,所以从左到右读取代码是很自然的。 但是当使用单个等于号( irb(main):010:0> b = 10 + 20=> 30irb(main):011:0> b=> 30irb(main):012:0> Shell 上面示例中,首先对 灵活输入 Ruby的变量可以容纳任何类型的数据,甚至可以更改其持有的数据类型。 例如: irb(main):012:0> c = 200=> 200irb(main):013:0> c = 'Flexible Typing'=> 'Flexible Typing'irb(main):014:0> c=> 'Flexible Typing'irb(main):015:0> c = 0.0001=> 0.0001irb(main):016:0> c=> 0.0001irb(main):017:0> Shell 第一次赋予 命名变量 大多数Ruby变量(局部变量)的命名都有一些由
除了那些虚拟机的要求,Ruby开发者对变量名称有几个常见风格偏好:
好的变量名的示例如下: 一些不好的Ruby变量名称的几个例子,如下所示:
练习使用IRB存储每个以下变量名称的值。 哪些名字是好的,哪些是是无效的Ruby变量名称,哪些是有效的,哪些是Ruby不建议使用的风格?
3. 字符串在现实世界中,字符串是将一个个字符串联起来的。 编程中的字符串与真实字符串无关。 编程中的字符串用于存储字母和数字的集合。它可以是一个单一的字母,如“ 编写一个字符串Ruby字符串被定义为一个引号( 子字符串通常使用字符串,可从整个长字符串提取出来的一部分 - 这提取出来的部分称为子字符串。在 irb(main):017:0> string = 'Ruby in 30 Minutes at yiibai.com'=> 'Ruby in 30 Minutes at yiibai.com'irb(main):018:0> string[0..8]=> 'Ruby in 3'irb(main):019:0> string[8..16]=> '30 Minute'irb(main):020:0> string[8..-1]=> '30 Minutes at yiibai.com'irb(main):021:0> string[8..-2]=> '30 Minutes at yiibai.co'irb(main):022:0> Shell 正号和负号的位置 字符串中的字符每个都有一个位置编号,它们从零开始。 所以对于字符串中的开头“Ru”,“R”位置编号为 要在主字符串中提取出一个子串,可指定提取的起始位置和结束位置。 因此,上面的 Ruby解释负的位置从字符串的末尾返回。所以在上面示例中,结尾的字符串“ 所以如果一个字母同时有正数和负数的位置,那么应该使用哪个? 建议使用正数,因为这样它们更容易理解。 但是,如果要基于字符串末尾查找东西(例如“该字符串的最后一个字符是什么?”),则使用负数指定位置。 常用的字符串方法在IRB中使用字符串(对象)中一些常用的方法。 .length
irb(main):022:0> string = '0123456789'=> '0123456789'irb(main):023:0> string.length=> 10irb(main):024:0> string = 'maxsu'=> 'maxsu'irb(main):025:0> string.length=> 5irb(main):026:0> Shell
.split 有时想要将一个字符串分成几部分。 例如,假设有一个存储为字符串的句子,并将其分解成单词: C:\Users\Administrator>irbirb(main):001:0> string = 'This is my sample sentence.'=> 'This is my sample sentence.'irb(main):002:0> string.split=> ['This', 'is', 'my', 'sample', 'sentence.']irb(main):003:0> Shell
.split使用参数 但有时要分割的不是一个带有空格的字符。 irb(main):003:0> numbers = '1,2,3,4,5,6,7,8'=> '1,2,3,4,5,6,7,8'irb(main):004:0> numbers.split=> ['1,2,3,4,5,6,7,8']irb(main):005:0> numbers.split(',')=> ['1', '2', '3', '4', '5', '6', '7', '8']irb(main):006:0> Shell 在第一次分割的调用中,它尝试使用空格作为分隔符,但字符串中没有分隔符,所以得到一个整个字符串的数组。 在第二次尝试中,指定使用逗号(“ .sub 和 .gsub 这两种方法可以用来替换字符串的部分。它们就像在文字处理器中使用“查找和替换”。 对于 irb(main):013:0> greeting = 'Hello, Hello Everyone!'=> 'Hello, Hello Everyone!'irb(main):014:0> greeting.sub('Hello','Hi')=> 'Hi, Hello Everyone!'irb(main):015:0> greeting.gsub('Hello','Hi')=> 'Hi, Hi Everyone!'irb(main):016:0> Shell 组合字符串和变量将变量的值与字符串相结合这是在开发应用程序中最经常使用的。 例如,现在从下面这个例子开始: 'Good morning, ?? !' Ruby 当把上面语句放入 需要做的就是将变量与字符串组合。有两种方法可以做到这一点。 方法-1. 字符串连接 第一种方法,可使用字符串连接,它将字符串与加号连接: irb(main):021:0> name = 'Maxsu'=> 'Maxsu'irb(main):022:0> puts 'Good morning, ' + name + ' ! 'Good morning, Maxsu !=> nilirb(main):023:0> Ruby 在第一行中,设置了一个 方法-2. 字符串插值 第二种方法是使用字符串插值,将数据粘贴到字符串的中间。 字符串插值仅适用于双引号字符串。在字符串内使用插值标记 irb(main):023:0> name = 'Maxsu'=> 'Maxsu'irb(main):024:0> puts 'Good morning, #{name}!'Good morning, Maxsu!=> nilirb(main):025:0> Shell 如果比较输出结果,就会看到它们输出的是完全相同的结果。 内插样式往往是输入较少的字符类型,较少的双引号打开/关闭,所以可避免加双引号时忘记书写对称(往往有输入多一个,少一个的问题)。 内插插入代码 还可以将任何Ruby代码或计算表达式内置在括号内,如下所示: irb(main):025:0> modifier = 'very '=> 'very 'irb(main):026:0> mood = 'excited'=> 'excited'irb(main):028:0> puts 'I am #{modifier * 3 + mood} for today's play!'I am very very very excited for today's play!=> nilirb(main):029:0> Shell 首先对 4. 符号符号有点难以解释,它们是字符串和数字的一半。但是可以很容易识别一个符号,因为它是以冒号开始一个或多个字母,如 新程序员的符号如果你是编程的新手,可将一个符号看作是一个几乎没有任何方法和没有字符串插值的被剥离下来的字符串。 将正确的字符串与类似符号的方法列表进行比较,如下所示: 2.1.1 :001> 'hello'.methods2.1.1 :002> 'hello'.methods.count2.1.1 :003> :hello.methods2.1.1 :004> :hello.methods.count Shell 有经验的程序员的符号如果你是一个有经验的程序员,想象一个符号是一个“命名整数”。 符号引用的实际值无关紧要。 我们所关心的是,虚拟机内对该值的任何引用将返回相同的值。 因此,符号在全局符号表中定义,它们的值不能改变。 5. 数字值数字有两种基本类型:整数(整数)和浮点数(有小数点)。 重复指令重复执行指令在其他语言中的常见模式是 for(var i = 0; i 5; i++){ console.log('Hello, World');} Js 对于循环是很常见的,但它们的代码不是很容易阅读。 因为Ruby的整数是它们拥有方法的对象。 其中的一个方法: 以Ruby样式重写上述循环: 5.times do puts 'Hello, World!'end Ruby 在这个例子中,使用 6. 块块是Ruby中经常使用的强大概念。 可将块视为一组捆绑在其他地方使用的指令的方式。 块的开始和结束在上一节中有一个使用 5.times do puts 'Hello, World!'end Ruby 该块以关键字 支架块当块仅包含单个指令时,经常使用备用标记 5.times{ puts 'Hello, World!' } Ruby 块被传递给方法那么使用块来做什么? 块可以用来作为传递给方法调用的参数。 例如,如果调用了 块中有很多的方法。 就像前面看到的 irb(main):038:0> 'this is a sentence'.gsub('e'){ puts 'Found an E!'}Found an E!Found an E!Found an E!=> 'this is a sntnc'irb(main):039:0> Shell 请注意,” 块参数通常,在块内指示需要引用正在使用的值。 当在编写块代码时,可以在管道字符中指定一个块参数: 5.times do |i| puts 'Hello, World! 'end Ruby 什么值应该放入该块参数,这取决于要调用的方法。 在本示例中, 5.times do |i| puts '#{i}: Hello, World!'end Ruby 上面代码输出结果如下 - irb(main):045:0> 5.times do |i|irb(main):046:1* puts '#{i}: Hello, World!'irb(main):047:1> end0: Hello, World!1: Hello, World!2: Hello, World!3: Hello, World!4: Hello, World!=> 5irb(main):048:0> Shell 而 irb(main):048:0> 'this is a sentence'.gsub('e'){|letter| letter.upcase}=> 'this is a sEntEncE'irb(main):049:0> Ruby 在上面结果中看到 7.数组通常当编写程序时,我们需要处理数据的集合。先来看看最常见的数据集合 - 数组。 可视化模型数组是数字索引列表。 想象一下,有一张空白的纸,画了三个小盒子: --- --- ---| || || | --- --- --- 可以按照从左到右对每一个位置进行编号: --- --- ---| || || | --- --- --- 0 1 2 然后在每个框中放入字符串(或其它值): ------------- --------- ----------| 'Breakfast' || 'Lunch' || 'Dinner' | ------------- --------- ---------- 0 1 2 现在变成一个有三元素的数组。 Ruby数组的大小可以增长和缩小,所以如果添加一个元素,它通常会在结束位置添加,索引值也会变递增 ------------- --------- ---------- -----------| 'Breakfast' || 'Lunch' || 'Dinner' || 'Dessert' | ------------- --------- ---------- ----------- 0 1 2 3 请注意,最后一个元素的位置总是比元素的数量小 数组中在索引为 代码中的数组以下是Ruby代码中相同建模的方法: irb(main):049:0> meals = ['Breakfast', 'Lunch', 'Dinner']=> ['Breakfast', 'Lunch', 'Dinner']irb(main):050:0> meals 'Dessert'=> ['Breakfast', 'Lunch', 'Dinner', 'Dessert']irb(main):051:0> meals[2]=> 'Dinner'irb(main):052:0> meals.last=> 'Dessert'irb(main):053:0> Ruby 在上面代码运行结果中,观察到…
常用数组方法数组有很多很酷的东西。 以下是几个例子: .sort方法
irb(main):056:0> array1 = ['this', 'is', 'an', 'array']=> ['this', 'is', 'an', 'array']irb(main):057:0> array1.sort=> ['an', 'array', 'is', 'this']irb(main):058:0> array1=> ['this', 'is', 'an', 'array']irb(main):059:0> Ruby 可以使用 使用数组只要需要一个列表,其中元素是以特定的顺序排序的。 其他的尝试 在数组上尝试下面这些常见的方法:
可以参考这个文档了解更多详细信息:http://www./core-2.1.2/Array.html 8.哈希哈希是数据的集合,哈希中的数据的每个元素是按名称来寻址。作为一个比喻,想一下冰箱。 如果要跟踪放在冰箱内的东西,我们并不关心它的放在哪里 - 顺序并不重要。 相反只是按名称去组织这些东西。如名称“ 键/值对哈希是无序的集合,其中数据被组织成“键/值对”。 哈希的语法更复杂,需要一些习惯: irb(main):001:0> produce = {'apples' => 3, 'oranges' => 1, 'carrots' => 12}=> {'apples'=>3, 'oranges'=>1, 'carrots'=>12} Shell 键用作为地址,值是该地址的数据。 在 再尝试一些代码: irb(main):006:0> produce['grapes'] = 219=> 219irb(main):007:0> produce=> {'grapes'=>219}irb(main):008:0> produce['oranges'] = 66=> 66irb(main):009:0> produce=> {'grapes'=>219, 'oranges'=>66}irb(main):010:0> produce.keys=> ['grapes', 'oranges']irb(main):011:0> produce.values=> [219, 66]irb(main):012:0> Ruby 在这些说明的第一行中,向哈希添加了一个新值。 由于“grapes”键不在原始哈希中,所以它的值为 简化哈希语法通常会使用符号作为哈希的键。 当所有的键都是符号时,可以使用一个速记语法: irb(main):012:0> produce = {apples: 3, oranges: 1, carrots: 12}=> {:apples=>3, :oranges=>1, :carrots=>12}irb(main):013:0> puts 'There are #{produce[:oranges]} oranges in the fridge.'There are 1 oranges in the fridge.=> nilirb(main):014:0> Shell 请注意,键以冒号结尾,而不是以冒号开始,即使这些是符号。 这个简化的语法能在 9. 条件条件语句评估求值结果为 一些对象也有返回 条件分支/指令为什么要有条件语句? 最常见的是控制条件指令,特别是: def water_status(minutes) if minutes 7 puts 'The water is not boiling yet.' elsif minutes == 7 puts 'It's just barely boiling' elsif minutes == 8 puts 'It's boiling!' else puts 'Hot! Hot! Hot!' endend# run method with difference parameterwater_status(5)water_status(7)water_status(8)water_status(9) Ruby 尝试使用: 理解执行流程 当 当 当 当 if语句可能的结构
相等与分配值编写条件语句时遇到常见错误是书写
还可以使用逻辑运算符组合条件语句。 最常见的是“逻辑与”和“逻辑或”。 在Ruby中,您可以使用这样的双符号( 10. Nil和虚无什么是虚无? 当我们表达一个东西,没有确定它是什么东西的暂时可以叫它为:虚无,不是没有什么东西吗? 好的,这太多哲学了,这有确实点难解释了。
如果有三个鸡蛋,您吃三个鸡蛋,那么可能认为现在您“没有什么”蛋了,但是在鸡蛋方面有“ 如果使用一个单词,如“
编写Ruby代码时遇到的大部分错误是涉及 11. 对象,属性和方法Ruby是面向对象的编程语言Ruby是一种面向对象的编程语言,在与VM内部交互的所有东西都是对象。 每条数据都是一个对象。 对象保存的信息称为属性,可以执行对象的方法。 作为一个对象的例子,想像你是一个人。 你有像高度,重量和眼睛颜色的属性。 你有“走路”,“跑步”,“洗碗”和“白日梦”的方法。不同类型的对象具有不同的属性和方法。 在接下来的章节中,将介绍一些Ruby中常见的特定类型的对象。 类和实例在面向对象编程中,我们定义了类,它们是类别或类型的东西的抽象描述。 它定义了该类型的所有对象的属性和方法。 定义一个类 例如,考虑对一个学校信息建模。要创建一个名为“ 尝试在IRB编写上面代码: class Student attr_accessor :first_name, :last_name, :primary_phone_number def introduction puts 'Hi, I'm #{first_name}!' endend Ruby
创建类的实例
想像你就是一个学生,不是一个抽象的概念,因为你是一个实际的人。这个实际的人是 另一方面, 从文件运行Ruby一般情况下,很少在
ruby student.rb Shell 由于这个文件是空的,所以不应该得到任何输出。 创建 在文本编辑器中,开始编写类的结构: class Studentend Ruby 在类的内部,通常使用 class Student def introduction puts 'Hi, I'm #{first_name}!' endend Ruby 请注意, class Student attr_accessor :first_name, :last_name, :primary_phone_number def introduction puts 'Hi, I'm #{first_name}!' endend Ruby 运行文件回到终端,尝试用 这是为什么呢? 上面步骤中已经定义了一个 创建实例 当定义一个类后,还要创建类的一个实例,如下所示: frank = Student.new Ruby 在 使用以下语法调用方法: 在文件中创建一个实例 在 frank = Student.newfrank.first_name = 'Frank'frank.introduction Ruby 最终完整的代码如下所示 - class Student attr_accessor :first_name, :last_name, :primary_phone_number def introduction puts 'Hi, I'm #{first_name}!' endendfrank = Student.newfrank.first_name = 'Max'frank.introduction Ruby 保存代码并返回到终端,再次执行 方法参数有时,方法使用一个或多个参数来完成一些事情。 例如,可以调用 class Student attr_accessor :first_name, :last_name, :primary_phone_number def introduction(target) puts 'Hi #{target}, I'm #{first_name}!' endendfrank = Student.newfrank.first_name = 'Maxsu'frank.introduction('Minlee') Ruby 保存代码并返回到终端,再次执行 返回值在Ruby中,每次调用方法时都会得到一个值。 默认情况下,Ruby方法返回其评估求值的最后一个表达式的值。 现在向 class Student attr_accessor :first_name, :last_name, :primary_phone_number def introduction(target) puts 'Hi #{target}, I'm #{first_name}!' end def favorite_number 7 endendfrank = Student.newfrank.first_name = 'Maxsu'puts 'Maxsu's favorite number is #{frank.favorite_number}.' Ruby 打开终端运行上面代码,应该看到:“ 注意:写在最后,需要注意的是:这篇教程包教不包会! |
|
来自: guizhishuai > 《RUBY》