美文网首页
ruby 语法

ruby 语法

作者: Lucien_d70a | 来源:发表于2018-03-25 00:49 被阅读0次

    hello ruby

    • 新建一个test.rb文件,在里面加一条 puts 'hello ruby',终端执行,ruby test.rb 就会看到 => #hello ruby

    ruby 字符串插入

    name = "ruby"
    puts "你好吗,#{name}"  
    => # 你好吗,ruby
    # 类似与js ES6的 "你好吗 ${name}" 
    

    任何语言都通用的数据类型

    1. String 字符串 "abc"
    2. Number 数值 123123
    3. Array. 数组 [1,2,3]
    4. Hash #类似js的对象,key:value
    {
       "name": "dashi",
       "birth": "1982-9-16"
    }
    

    方法

    • 您可以定义一个接受参数的方法,如下所示:
    def method_name (var1, var2)
       expr..
    end
    
    • 您可以为参数设置默认值,如果方法调用时未传递必需的参数则使用默认值:
    def method_name (var1=value1, var2=value2)
       expr..
    end
    
    • 当您要调用方法时,只需要使用方法名即可,如下所示:
    method_name 25, 30
    
    • 使用带参数方法最大的缺点是调用方法时需要记住参数个数。例如,如果您向一个接受三个参数的方法只传递了两个参数,Ruby 会显示错误。
    def test(a1="Ruby", a2="Perl")
       puts "编程语言为 #{a1}"
       puts "编程语言为 #{a2}"
    end
    test "C", "C++" # 编程语言为C,编程语言为C++,
    test # 编程语言为Ruby,编程语言为Perl,
    

    Ruby 中的每个方法默认都会返回一个值。这个返回的值是最后一个语句的值。

    块和函数

    当方法定义在类的外部,方法默认标记为 private。另一方面,如果方法定义在类中的,则默认标记为 public。

    方法默认的可见性和 private 标记可通过模块(Module)的 public 或 private 改变。

    当你想要访问类的方法时,您首先需要实例化类。然后,使用对象,您可以访问类的任何成员。

    • 定义一个函数 并 调用
    def test
     puts "hello ruby"
    end
    test # => hello ruby
    
    • 函数定义参数
    def test(var1 = "hello",var2 = "ruby")
     puts "#{var1} #{var2}"
    end
    test # => hello ruby
    test("hello","rails") #=>hello rails
    
    • 函数和块
    def test(var1 = "hello",var2 = "ruby")
     puts "#{var1} #{var2}"
     yield
    end
    test {puts "hello cwh"} 
    #=> hello rails
    #=> hello cwh
    
    def test(var1 = "hello",var2 = "ruby")
     puts "#{var1} #{var2}"
     yield "hello cwh"
    end
    test {|e| puts e} 
    #=> hello rails
    #=> hello cwh
    
    • 块有多种定义方法
    test do 
     xxxx
    end
    
    test { |接受的参数| xxxx }
    # 以上方法都可以用yield来调用
    
    
    # 或者 通过参数传递来调用,但是block必须是最后一个参数
    def test (&block)
     &block.call
    end
    
    • 一个官方例子
    give "我", :what => '咖啡', :count => '2', :unit => '杯' do
      "味道不错哟!"
    end
    
    #其实就是
    give( 
    "我" ,
    { :what => '咖啡', :count => '2' }
    do "味道不错哟!" end ),
    

    变量

    • 常量,一般大写开头,例如: ANDROID_SYSTEM = 'android'
    • $开头:全局变量(Global variable)。
    • @开头:实例变量(Instance variable)。
    • @@开头:类变量(Class variable)类变量被共享在整个继承链中

    面向对象

    • 类的变量
    1. 局部变量:局部变量是在方法中定义的变量。局部变量在方法外是不可用的。在后续的章节中,您将看到有关方法的更多细节。局部变量以小写字母或 _ 开始。
    2. 实例变量:实例变量可以跨任何特定的实例或对象中的方法使用。这意味着,实例变量可以从对象到对象的改变。实例变量在变量名之前放置符号(@)。
    3. 类变量:类变量可以跨不同的对象使用。类变量属于类,且是类的一个属性。类变量在变量名之前放置符号(@@)。
    4. 全局变量:类变量不能跨类使用。如果您想要有一个可以跨类使用的变量,您需要定义全局变量。全局变量总是以美元符号($)开始。
    initialize 方法
    • 为了在类的外部读取类中已定义的变量,我们可以通过定义访问器(getter)方法来访问。下面的实例演示了访问器方法的用法:
    class Box
       def initialize(w,h)
          @width, @height = w, h
       end
    end
    # 一但创建对象时候,就会触发
    
    访问器(getter)
    class Box
       # 构造函数
       def initialize(w,h)
          @width, @height = w, h
       end
     
       # 访问器方法
       def printWidth
          @width
       end
     
       def printHeight
          @height
       end
    end
     
    # 创建对象,初始化盒子的高度与宽度
    box = Box.new(10, 20)
     
    # 使用访问器方法
    x = box.printWidth()
    y = box.printHeight()
     
    puts "盒子宽度 : #{x}"
    puts "盒子高度 : #{y}"
    
    #=>盒子宽度 : 10
    #=>盒子高度 : 20
    

    设置器(setter)

    # 定义类
    class Box
       # 构造器方法
       def initialize(w,h)
          @width, @height = w, h
       end
     
       # 访问器方法
       def getWidth
          @width
       end
       def getHeight
          @height
       end
     
       # 设置器方法
       def setWidth=(value)
          @width = value
       end
       def setHeight=(value)
          @height = value
       end
    end
     
    # 创建对象
    box = Box.new(10, 20)
     
    # 使用设置器方法
    box.setWidth = 30
    box.setHeight = 50
     
    # 使用访问器方法
    x = box.getWidth()
    y = box.getHeight()
     
    puts "盒子宽度 : #{x}"
    puts "盒子高度 : #{y}"
    
    #=>盒子宽度 : 30
    #=>盒子高度 : 50
    

    这集中方法比较常用 所以 attr_accessor :variable_name,ttr_reader :variable_name、attr_writer :variable_name 三种属性声明方法,其中:accessor=reader+writer。

    实例方法
    • 实例方法的定义与其他方法的定义一样,都是使用 def 关键字,但它们只能通过类实例来使用,如下面实例所示。它们的功能不限于访问实例变量,也能按照您的需求做更多其他的任务。
    # 定义类
    class Box
       # 构造方法
       def initialize(w,h)
          @width, @height = w, h
       end
       # 实例方法
       def getArea
          @width * @height
       end
    end
     
    # 创建对象
    box = Box.new(10, 20)
     
    # 调用实例方法
    a = box.getArea()
    puts "Area of the box is : #{a}"
    
    #=>Area of the box is : 200
    
    类方法和类变量
    • 类变量是所有实例中的共享变量。@@
    • 类方法配合类变量使用。
    class Box
       # 初始化类变量
       @@count = 0
       def initialize(w,h)
          # 给实例变量赋值
          @width, @height = w, h
     
          @@count += 1
       end
     
       def self.printCount()
          puts "Box count is : #@@count"
       end
    end
     
    # 创建两个对象
    box1 = Box.new(10, 20)
    box2 = Box.new(30, 100)
     
    # 调用类方法来输出盒子计数
    Box.printCount()
    #=>Box.printCount()
    

    ps: 实例方法和类方法不同就是 实例方法要new 类方法不用new。

    访问控制
    • Public 方法: Public 方法可被任意对象调用。默认情况下,方法都是 - public 的,除了 initialize 方法总是 private 的。
    • Private 方法: Private 方法不能从类外部访问或查看。只有类方法可以访问私有成员。
    • Protected 方法: Protected 方法只能被类及其子类的对象调用。访问也只能在类及其子类内部进行。
    类的继承
    • 弄一个新累,继承一个旧类。
    • 新的叫子类,旧的叫父类。
    重载
    • 子类改变了父类的某方法代码,没事的,你只要创建对象的时候new子类就好了。

    相关文章

      网友评论

          本文标题:ruby 语法

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