2.1 ruby语言入门

作者: 808cb3be8e58 | 来源:发表于2018-12-06 23:45 被阅读23次
    在第一章中,项目我们已经创建好并且能输出第一个helloworld了,我们先不急着做项目,先了解一下ruby,至少需要看得懂代码。这一章我们简单介绍一些ruby语言的语法。
    学习建议:

    1)根据例子实际操作,不要直接复制我的代码,照着例子自己写代码,这样虽然总是会出现一些意想不到的小错误,但这个过程就是编程入门必须经历的。
    2)方法不需要死记硬背,自己敲打完代码,在脑中会有一个大体的印象,实际应用时,可以再回来翻看具体的用法。
    3)第二章建议三天内看完。

    1、运行程序的平台,有三种方式运行ruby,第1种方法必须在项目文件夹下运行,第2、3种方法可以在任意文件夹下运行,前提是必须安装ruby

    (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"

    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,再去看这本书。因为算法比较难,你学会一门语言,再看算法书会比较有代入感。

    3、ruby类、模块

    (1)通过class来定义一个类,类是抽象的,通过构造方法(new)才能将类变成一个实例。比如说我们之后建立一个论坛,定义一个Post类来代表帖子,post = Post.new来新建一个帖子,Post指的就是帖子这个一大类别,是抽象的,但是post是一个实际对象,指的是新建的这一个帖子,这个帖子有标题、内容等。类的命名规则用大写字母开头,多单词组合时,每个单词首字母大写
    (2)通过module来定义一个模块,模块是一种把方法、类和常量组合在一起的方式,模块和类用法差不多,命名规则与类是一样的,但是模块不可以被实例化。如果你之前没接触过代码的话,肯定对这一段描述会很迷惑,不过没有关系,咱们都会经历这一个阶段,等你代码写的多了,自然而然就明白了。

    #定义一个类,命名为Car
    class Car
    end
    
    #定义一个模块,命名为BigCar
    module BigCar
    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
    

    Ruby on Rails开发者文档
    http://doc.rubyfans.com/

    相关文章

      网友评论

        本文标题:2.1 ruby语言入门

        本文链接:https://www.haomeiwen.com/subject/bqgicqtx.html