了解一下ruby,只是需要看得懂代码。这一章我们简单介绍一些ruby语言的语法。在第一章中,项目我们已经创建好并且能输出第一个helloworld了,我们先不急着做项目,先
(1)在控制台中运行ruby
在写项目的时候,建议用这个方法,因为我们之后做项目,在控制台中可以直接调用项目中类方法和实例方法,测试很方便。
登录vagrant,打开项目目录,运行rails console(简写rails c)进入控制台,输入exit退出控制台
vagrant@vagrant-ubuntu-trusty-64:/vagrant/data_system$ rails c Running via Spring preloader in process 2659 Loading development environment (Rails 5.1.6.1) irb(main):001:0> puts "hello world" hello world => nil irb(main):002:0> exit
(2)以irb交互的方式输入代码直接执行
irb这个工具会随着 Ruby 的安装自动带有,只需要在本地电脑命令行中键入 irb,就会进入交互式 Ruby。输入exit退出交互模式。
xuzhaoning@xuchaoningdeMacBook-Air:~$ irb 2.2.1 :001 > puts "hello world" hello world => nil 2.2.1 :002 > exit
(3)创建程序文件,再在命令行运行此文件
创建一个后缀为.rb的文件,命名为first_project.rb,里面写上代码puts “hello world”
进入创建的这个程序文件的目录命令行上运行ruby first_project.rb,会输出hello world。注意一定要在这个文件的目录下运行。
xuzhaoning@xuchaoningdeMacBook-Air:~$ ruby first_project.rb #输出信息 hello world
2、ruby是面向对象语言
ruby是面向对象语言,面向对象的意思,顾名思义,就是对对象进行操作,在ruby里面,想要创建一个对象,首先要创建类,然后调用new这个构造函数将类实例化,这个实例化之后的实体就是一个对象。
#咱们要对“车”进行实例化,先创建一个类Car class Car end
#然后创建车这个对象 car1 = Car.new
car1就是从Car这个类,通过new构造方法,来创建的对象。
初学者能对“对象”这个概念理解到这一层就可以了,语言本身就是将抽象的东西,用代码描述出来,来实现各种功能。要是想深入了解对象以及构造函数的工作,可以看《算法第四版》这本书。建议初学者先跟着我学会ruby,再去看这本书。因为算法比较难,你学会一门语言,再看算法书会比较有代入感。
(1)通过class来定义一个类,类是抽象的,通过构造方法(new)才能将类变成一个实例。比如说我们之后建立一个论坛,定义一个Post类来代表帖子,post = Post.new来新建一个帖子,Post指的就是帖子这个一大类别,是抽象的,但是post是一个实际对象,指的是新建的这一个帖子,这个帖子有标题、内容等。类的命名规则用大写字母开头,多单词组合时,每个单词首字母大写
(2)通过module来定义一个模块,模块是一种把方法、类和常量组合在一起的方式,模块和类用法差不多,命名规则与类是一样的,但是模块不可以被实例化。如果你之前没接触过代码的话,肯定对这一段描述会很迷惑,不过没有关系,咱们都会经历这一个阶段,等你代码写的多了,自然而然就明白了。
#定义一个类,命名为Car class Car end
#定义一个类,命名为Car class Car end
4、ruby方法
实例方法:是实例对象可以调用的方法。
类方法:是类可以直接调用的方法。
方法名命名规则:全部小写,多个单词用下划线_隔开
#定义一个类,命名为MethodTest irb(main):001:0> class MethodTest #定义一个实例方法,命名为ins_method irb(main):002:1> def ins_method irb(main):003:2> puts "调用实例方法" irb(main):004:2> end #定义一个类方法,命名为cla_method,「self.方法名」就是类方法 irb(main):005:1> def self.cla_method irb(main):006:2> puts "调用类方法" irb(main):007:2> end irb(main):008:1> end => :cla_method #new是构造函数,MethodTest.new就是将MethodTest这个类实例化成一个对象,用实例对象才能调用实例方法 irb(main):009:0> MethodTest.new.ins_method 调用实例方法 => nil #不能用类直接调用实例方法,用MethodTest类直接调用实例方法会报错 irb(main):012:0> MethodTest.ins_method NoMethodError: undefined method 'ins_method' for MethodTest:Class Did you mean? instance_method from (irb):12 #cla_method是类方法,用MethodTest类直接调用就可以,不需要先将类实例化 irb(main):010:0> MethodTest.cla_method 调用类方法 => nil
5、ruby变量、常量
(1)全局变量:以$开头。在整个程序中都可以访问,全局变量的值在程序中任何地方都可以修改。在实际项目中,一般不使用。
#定义一个全局变量 $name = "xzn"
2)实例变量:以@开头,实例对象可以直接调用的变量。相同的变量对于不同的对象会有不同的值,只要对象还在,实例变量对应的值就不会消失。在实际开发中经常用到。
#创建一个名为Hello的类,在类中定义两个方法initialize、set_name。 irb(main):001:0> class Hello #initialize方法是类调用构造函数时执行的。Hello.new("Amy")会调用该方法,将@name赋值为"Amy" irb(main):002:1> def initialize(myname) irb(main):003:2> @name = myname irb(main):004:2> end #set_name是一个实例方法,通过实例(也就是对象)能够调用这个方法,不能通过类直接调用,比如:Hello.set_name是错误的。 irb(main):005:1> def set_name irb(main):006:2> puts "Hello,my name is #{@name}" irb(main):007:2> end irb(main):008:1> end => :set_name #通过类调用new构造方法创建一个对象,命名为amy。将@name赋值为"Amy" irb(main):009:0> amy = Hello.new("Amy") => #<Hello:0x00007f5901a07f88> #通过amy这个对象,调用set_name实例方法,会输出puts后面的语句,此时@name的值为"Amy" irb(main):010:0> amy.set_name Hello,my name is Amy => nil #通过类调用构造方法再创建一个对象,命名为li_hua。将@name赋值为"LiHua" irb(main):011:0> li_hua = Hello.new("LiHua") => #<Hello:0x00007f5901a2b348> #此时@name的值为"LiHua" irb(main):012:0> li_hua.set_name Hello,my name is LiHua => nil #再次用amy对象调用set_name方法,看一下@name实例变量,在不同的实例中,是否会相互影响。 #amy对象中@name的值是"Amy"。li_hua对象中@name的值是"LiHua",相同的变量对于不同的对象会有不同的值,不会相互影响。 irb(main):013:0> amy.set_name Hello,my name is Amy => nil
3)类变量:以@@开头,所有实例可以共享的一个变量。
irb(main):001:0> class Hello irb(main):002:1> def initialize(myname) irb(main):003:2> @@name = myname irb(main):004:2> end irb(main):005:1> def set_name irb(main):006:2> puts "Hello,my name is #{@@name}" irb(main):007:2> end irb(main):008:1> end => :set_name irb(main):009:0> amy = Hello.new("Amy") => #<Hello:0x00007f5901a07f88> irb(main):010:0> amy.set_name Hello,my name is Amy => nil irb(main):011:0> li_hua = Hello.new("LiHua") => #<Hello:0x00007f5901a2b348> irb(main):012:0> li_hua.set_name Hello,my name is LiHua => nil #在上面@name实例变量例子中,相同的变量对于不同的对象会有不同的值,amy对象中,@name的值为“Amy”, #lihua对象中,@name的值为“Lihua”。但是对于@@name类变量,@@name的值是被这个类实例化出来的对象共用的,当@@name的值为“Lihua”,那么所有对象对应的@@name的值也变成了“Lihua”,主要对比实例变量例子中的区别。 irb(main):013:0> amy.set_name Hello,my name is LiHua => nil
(4)常量:规定大写字母开头,实际开发中一般全部大写,用来定义一个不可变的值。常量不可以定义在方法内。定义在类或模块中的常量,可以被类和模块内部访问。定义在类或模块外的常量,可以被全局访问。
irb(main):001:0> class ConstantExample #定义常量 irb(main):002:1> VAR1 = 100 irb(main):003:1> VAR2 = 200 #定义一个实例方法 irb(main):004:1> def put_var irb(main):005:2> puts "第一个常量为#{VAR1}" irb(main):006:2> puts "第二个常量为#{VAR2}" irb(main):007:2> end irb(main):008:1> end => :put_var #实例化一个constant_example对象 irb(main):009:0> constant_example = ConstantExample.new => #<ConstantExample:0x00007f5901982950> #通过实例化对象调用实例方法,输出被定义的常量 irb(main):010:0> constant_example.put_var 第一个常量为100 第二个常量为200 => nil