• Ruby学习笔记


    1、变量

    # -*- coding: UTF-8 -*-
    
    puts "hello world"
    name1 = "Joe"
    name2 = "Mary"
    puts "你好 #{name1},  #{name2} 在哪?"
    
    
    # 1、定义一个全局变量
    $g_v = 10
    
    
    # 定义一个类,类名必须以大写开头
    class Class1
      def test1
    
        # 格式化,使用#号加变量名的方式
        puts "全局变量的值为#$g_v"
      end
    end
    
    class Class2
      def test1
        puts "全局变量的值为#$g_v"
      end
    end
    
    
    # 实例化一个类,用new方法
    c1 = Class1.new
    
    c2 = Class2.new
    
    # 实例调用实例方法,用点号
    c1.test1
    
    c2.test1
    
    
    
    
    class Class3
      # 这个就是构造方法,和python中的__init__方法是一样的
      def initialize(id,name,add)
        @id = id
        # @符号来定义实例变量
        @name = name
        @add = add
      end
    
      # ruby定义方法,如果该方法不需要传参,则可以没有这个括号,当然有也没错
      def outputvalue()
        puts "id为#@id"
        # 在字符串中访问实例变量用#@加上变量名
        puts "name为#@name"
        puts "add为#@add"
      end
    
    end
    
    # 初始化一个类的实例,这个类有构造方法,需要参数,这里要传参数去实例化一个类
    c3 = Class3.new(1,"c3","sz")
    
    c3.outputvalue
    
    
    
    
    
    class Class4
      # @@定义了一个类变量,我们这里的用途是统计这个类的实例个数
      @@num = 0
      def initialize(id,name,add)
        @id = id
        @name = name
        @add = add
        @@num += 1
        # 因为类进行实例化必须要执行构造方法,所有我们在构造方法中对类变量进行加1的操作
      end
    
      def num_of()
        puts "实例的数量为#@@num"
      end
    end
    
    
    c4_1 = Class4.new(1,"c4_1","sz1")
    c4_1.num_of
    c4_2 = Class4.new(2,"c4_2","sz2")
    c4_2.num_of
    
    
    
    class Class4
      # 通过大写字母开头定义一个常量
      VAR1 = 20
      VAR2 = 30
    
    
      def initialize(id,name,add)
        @id = id
        @name = name
        @add = add
        @@num += 1
        # 因为类进行实例化必须要执行构造方法,所有我们在构造方法中对类变量进行加1的操作
      end
    
      def num_of()
        puts "实例的数量为#@@num"
      end
    end
    
    
    
    print <<EOF
    AAAA
    BBB
    CCC
    DDD
    EOF
    

    2、运算符

    # 1、赋值运算符
    
    a = 100
    b = 200
    c = 300
    
    a,b = b,a
    
    d,e,f = 10,20,30
    
    puts a
    
    
    puts d
    
    
    # 逻辑运算符
    #
    
    test1 = a && d
    puts test1
    
    
    
    test2 = a || d
    
    puts test2
    
    
    test3 = !a
    
    puts test3
    
    
    
    test4 = 1..10
    test5 = 1...10
    
    puts test4
    puts test5
    
    
    
    
    res = defined? test
    puts res
    

    3、条件判断和循环

    # if-elsif-else语句
    x = 10
    
    # 1、写法1,可以不写then
    if x > 1
      puts "大于1"
    elsif x < 1
      puts "小于1"
    else
      puts "等于1"
    end
    
    
    # 2、写法2,写then
    x = 10
    
    if x > 1 then
      puts "大于1"
    elsif x < 1 then
      puts "小于1"
    else
      puts "等于1"
    end
    
    
    
    
    # 3、if修饰符
    
    # code if condition
    # if修饰词组表示当 if 右边之条件成立时才执行 if 左边的式子。即如果 conditional 为真,则执行 code。
    #
    #
    $g_v2 = 10
    
    # print "debug
    " if $g_v2
    puts "debug
    " if $g_v2
    
    $g_v2 = nil
    
    print "debug
    " if $g_v2
    
    
    
    # 4、unless,和if正好相反,如果不满足unless后面的条件,则执行该unless下面的语句
    
    x=1
    unless x>2
      puts "x 小于 2"
    else
      puts "x 大于 2"
    end
    
    
    # unless修饰符
    
    # code unless conditional   如果 conditional 为假,则执行 code。
    
    $g_v2 = 10
    
    # print "debug
    " if $g_v2
    puts "debug1
    " unless $g_v2
    
    $g_v2 = nil
    
    print "debug2
    " unless $g_v2
    
    
    
    # 5、case语法,满足第一个条件之后,就不往下继续执行了,就会跳出case语法
    $age =  5
    case $age
    when 0 .. 2
        puts "婴儿"
    when 1 .. 6
        puts "小孩"
    when 1 .. 12
        puts "child"
    when 13 .. 18
        puts "少年"
    else
        puts "其他年龄段的"
    end
    
    
    
    
    # 6、循环语法
    #
    # 语法1
    $i = 0
    $num = 5
    
    while $i < $num
      puts("在循环语句中 i = #$i" )
      $i +=1
    end
    
    
    # 语法2 有个do,这个do可以省略
    $i = 0
    $num = 5
    
    while $i < $num do
      puts("在循环语句中 i = #$i" )
      $i +=1
    end
    
    
    # 语法3 有个: 这个:和前面必须有空格
    $i = 0
    $num = 5
    
    while $i < $num ;
      puts("在循环语句中 i = #$i" )
      $i +=1
    end
    
    
    
    # 语法4 while修饰符
    $i = 0
    $num = 5
    begin
      puts("在循环语句中4 i = #$i" )
      $i +=1
    end while $i < $num
    
    
    # 7、until语法,不满足条件,则执行语句
    
    $i = 0
    $num = 5
    
    until $i > $num  do
      puts("在循环语句中 i = #$i" )
      $i +=1;
    end
    
    
    # 8、for语法
    for i in 0...5
      puts "局部变量的值为 #{i}"
    end
    
    
    for i in 0..5
      puts "局部变量的值为 #{i}"
    end
    
    
    # 9、break语法
    for i in 0..5
      if i > 2 then
        break
      end
      puts "局部变量的值为 #{i}"
    end
    
    
    # 10、next语法,相当于continue
    
    for i in 0..5
      if i < 2 then
        next
      end
      puts "局部变量的值为1 #{i}"
    end
    
    # 11、redo语法,从头开始循环,如果满足条件,则从当前循环的条件开始,比如先打印0、1、2,然后i为3满足条件,则打印3,执行redo语句,i还是3,不会从0开始
    for i in 0..5
      if i > 2
        puts "局部变量的值为2 #{i}"
        redo
      else
        puts "#{i}"
      end
    end
    

    4、函数参数

    # 方法
    
    
    # 1、默认参数
    # 定义一个方法,该方法有默认参数,所以调用的时候可以传参也可以不不传参
    def test(a1="Ruby", a2="Perl")
      puts "编程语言为 #{a1}"
      puts "编程语言为 #{a2}"
    end
    test "C", "C++"
    test
    
    
    # 2、函数返回值
    # 定义一个函数,返回值
    def test
      i = 10
      j = 100
      k = 1000
      return i,j,k
    end
    
    
    res = test
    puts res
    
    
    # 3、函数的可变参数 *args
    
    def sample (*args)
      puts "参数个数为 #{args.length}"
      for i in 0...args.length
        puts "参数值为 #{args[i]}"
      end
    end
    sample "Zara", "6", "F"
    sample "Mac", "36", "M", "MCA"
    

    5、导入模块

    # 从当前目录下导入模块
    $LOAD_PATH << '.'
    
    require 'trig'
    require 'moral'
    
    # require 导入模块,可以省略rb
    
    
    # 模块名.方法名---->调用模块的方法
    # 模块名;;变量名---->调用模块的变量
    #
    y = Trig.sin(Trig::PI/4)
    puts y
    
    wrongdoing = Moral.sin(Moral::VERY_BAD)
    puts wrongdoing
    

    6、在类中引入模块

    $LOAD_PATH << '.'
    require "support"
    
    
    
    class Decade
      # 1、定义一个模块,在类中引入这个模块
      include Week
      no_of_yrs=10
      def no_of_months
        # ::使用引入模块中的变量
        puts Week::FIRST_DAY
        number=10*12
        puts number
      end
    
      def test_module
        # .使用引入的模块中的方法
        Week.weeks_in_year
      end
    end
    d1=Decade.new
    puts Week::FIRST_DAY
    Week.weeks_in_month
    Week.weeks_in_year
    d1.no_of_months
    
    d1.test_module
    

    模块的代码

    module Week
      FIRST_DAY = "Sunday"
      def Week.weeks_in_month
        puts "You have four weeks in a month"
      end
      def Week.weeks_in_year
        puts "You have 52 weeks in a year"
      end
    end
    

    7、字符串

    # 字符串
    
    
    # 定义一个字符串
    name1 = "Joe"
    name2 = "Mary"
    
    # 定义一个字符串,用内建方法
    name3 = String.new("hello")
    
    puts name3
    
    # 字符串中引入变量
    puts "你好 #{name1},  #{name2} 在哪?"
    
    
    
    
    x, y, z = 12, 36, 72
    puts "x 的值为 #{ x }"
    puts "x + y 的值为 #{ x + y }"
    # 字符串引入表达式
    puts "x + y + z 的平均值为 #{ (x + y + z)/3 }"
    
    
    s = "aAAAA"
    
    s = s.downcase
    
    puts s
    

    8、数组

    # 数组
    
    # 创建一个没有大小限制的数组
    names = Array.new
    
    # 创建一个容量为20的数组
    names = Array.new(20)
    
    # 计算数组长度的2个方法
    puts names.length
    puts names.size
    
    
    # 为数组中的每个元素赋值
    names = Array.new(6,"mac")
    
    puts "#{names}"
    
    
    # 初始化数组的方式
    names = Array.[](1,2,3,4,5,6)
    
    puts "#{names}"
    
    # 初始化数组的方式
    names = Array[1,2,3,4,5,6]
    
    
    # 创建一个数字数组
    names = Array(0..9)
    
    puts "#{names}"
    
    # 创建一个数字数组
    names = Array(0...9)
    puts "#{names}"
    

    9、hash

    # hash就是一个k-v的集合,和python中的dict一样
    #
    
    months = Hash.new
    
    # 创建一个hash
    H = Hash["a" => 100, "b" => 200, [1,"jan"] => "January"]
    
    # 获取hash的k对应的v
    puts "#{H['a']}"
    puts "#{H['b']}"
    puts "#{H[ [1,"jan"]]}"
    
    # 获取所有的keys
    puts "#{H.keys}"
    
    # 获取所有的values
    puts "#{H.values}"
    
    # 打印hash的值
    puts "#{H}"
    
    # 为hash添加一个元素
    H["c"] = "2b"
    
    puts "#{H.keys}"
    
    # 清空hash
    H.clear
    puts "#{H}"
    

    10、时间模块

    # 时间和日期
    
    time = Time.new
    
    # 获取当前的时间
    puts "当前时间为:" + time.inspect
    
    # 获取当前时间
    puts "当前时间为:" + Time.now.inspect
    
    puts time.year    # => 日期的年份
    puts time.month   # => 日期的月份(1 到 12)
    puts time.day     # => 一个月中的第几天(1 到 31)
    puts time.wday    # => 一周中的星期几(0 是星期日)
    puts time.yday    # => 365:一年中的第几天
    puts time.hour    # => 23:24 小时制
    puts time.min     # => 59
    puts time.sec     # => 59
    puts time.usec    # => 999999:微秒
    puts time.zone    # => "UTC":时区名称
    

    11、范围

    # 范围 Range
    #
    #
    
    # 范围(Range)无处不在:a 到 z、 0 到 9、等等。Ruby 支持范围,并允许我们以不同的方式使用范围:
    #
    # 作为序列的范围
    # 作为条件的范围
    # 作为间隔的范围
    
    # 这个只能正序排列,倒序不行,倒序是空
    range1 = (1..10).to_a
    
    range2 = (1...10).to_a
    
    range3 = ("a".."f").to_a
    
    range4 = ("a"..."f").to_a
    
    range5 = ("bat"..."bay").to_a
    
    # to_a方法,把一个范围转换为列表
    
    puts "#{range1}"
    puts "#{range2}"
    puts "#{range3}"
    puts "#{range4}"
    puts "#{range5}"
    
    # 循环
    range1.each do |r|
      puts "#{r}"
    end
    
    # 过滤出不符合条件的
    res = range1.reject{|r| r < 5}
    
    puts "#{res}"
    
    
    # 作为条件范围
    score = 70
    
    result = case score
             when 0..40
               "糟糕的分数"
             when 41..60
               "快要及格"
             when 61..70
               "及格分数"
             when 71..100
               "良好分数"
             else
               "错误的分数"
             end
    
    puts result
    
    
    # 作为一个间隔的范围
    if ((1..10) === 5)
      puts "5 在 (1..10)"
    end
    
    if (('a'..'j') === 'c')
      puts "c 在 ('a'..'j')"
    end
    
    if (('a'..'j') === 'z')
      puts "z 在 ('a'..'j')"
    end
    

    12、each

    # 迭代器
    
    # each迭代器
    ary = [1,2,3,4,5]
    ary.each do |i|
      puts i
    end
    
    h = Hash("a" => "aa","b" => "bb","c" => "cc")
    
    h.each do |i|
      puts i
    end
    
    
    a = [1,2,3,4,5]
    b = Array.new
    b = a.collect{ |x|x }
    puts b
    

    13、文件操作

    # 文件的输入和输出
    
    # puts 语句
    val1 = "This is variable one"
    val2 = "This is variable two"
    puts val1
    puts val2
    
    
    # gets 语句,获取用户的输入
    #
    puts "Enter a value :"
    val = gets
    puts val
    
    
    # putc语句,一次输出一个字符
    putc val1
    
    
    # print和puts的方法类似,但是print不会换行,而puts会换行
    print "Hello World"
    print "Good Morning"
    
    
    # 打开和关闭文件
    #
    #
    # 读文件
    afile = File.open("moral.rb","r")
    
    if afile
      res = afile.sysread(100)
      puts res
    else
      puts "error"
    end
    
    # 写文件
    aFile = File.new("input.txt", "r+")
    if aFile
      aFile.syswrite("ABCDEF")
    else
      puts "Unable to open file!"
    end
    
  • 相关阅读:
    【leetcode】500. Keyboard Row
    【排序算法汇总】5类8种排序算法
    【leetcode】339. Nested List Weight Sum
    ArcCatalog中将SQLServer中的空间数据导入到Oracle库中
    初学ArcGIS API for JavaScript
    ArcGIS API for JavaScript开发环境配置
    shapefile与gdb中不能允许存在的几何错误
    C#中的Dictionary字典类介绍(转载)
    泛型Dictionary<string,string>的用法
    空间数据存储格式wkb和wkt(转载)
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/11024676.html
Copyright © 2020-2023  润新知