• 《Rubu基础教程第五版》第七章笔记 方法


    方法是由对象定义的与该对象相关的操作。在Ruby中,对象的所有操作都被封装成方法。

    这个定义比Python好多了,万物皆对象的世界中,理论上应该不存在函数

    方法的调用通过.的方式

    带块的方法的调用

    (2..5).each {|i| puts i}

    (2..5).each do |i|

    puts i

    end

    这种方法 调用,被称为带块的方法的调用。

    其中的i被称为块变量,在执行块的时候,块变量由方法传到块内部。

    运算符形式的方法的调用

    +-*/ =~ []等,这些方法有的可以重新定义,有的不能改变默认的定义

    方法的分类

    可以分为

    实例方法

    类方法

    函数式方法

    实例方法,对象能使用实例方法有对象所属的类决定,但同样的方法可能输出形式不一样

    类方法,就是接受者是类的方法

    可以通过::或者.来调用类方法

    >> Array.new
    => []
    >> Array::new
    => []
    >> Time.now
    => 2020-05-28 11:44:15 +0800
    >> Time::now
    => 2020-05-28 11:44:17 +0800
    >> Array["a",1]
    => ["a", 1]
    >> 
    

    函数式方法

    没有接受者的方法,我们称为函数式的方法

    不需要接收者的方法就是函数式方法,这个定义很好,这个也就是Python中所谓的函数。

    方法的定义 这个跟Python已经比较像了

    ...

    方法的返回值 (跟Python有很大的区别,默认最后一行为返回值)

    定义带块的方法,就是Python中的生成器

    num is 1
    num is 2
    num is 4
    num is 8
    num is 16
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ cat myloop.rb 
    def myloop
      while true do
        yield
      end
    end
    
    num = 1
    myloop do        # 带块的方法,不需要each方法
      puts "num is #{num}"
      break if num > 10
      num *= 2
    end
    
    
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ 
    

    7.3.3 参数个数不确定的方法

    通过*args接收不定长参数,跟Python一样。

    7.3.4 关键字参数 这个跟Python有区别(应该叫默认参数更加合适)

    def 方法名 (参数1: 参数1的值,参数2: 参数2的值,...)

      希望执行的处理

    end

    默认参数用参数名:值的方式,Python用参数名=值的方式

    0
    146
    16
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ cat area2.rb 
    def area2(x: 0, y: 0, z: 0)
      xy = x * y
      yz = y * z
      zx = z * x
      (xy + yz + zx) * 2
    end
    
    p area2
    p area2(x: 2, y: 5, z: 9)
    p area2(x: 2, z: 4)
    
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ 
    

     如果不需要默认值,只需要"参数名:",这样的指定参数名就可以了

    24
    40
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ cat volume.rb 
    def volume(x:, y: 2, z: 4)
      x * y *z
    end
    
    p volume(x: 2, y: 3)
    p volume(x: 5)
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ 
    

     接收不定长的关键字参数,通过**args, 这个跟Python好像差不多

    [3, 3, 4, {}]
    [2, 0, 0, {:foo=>3, :zoo=>4}]
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ cat meth.rb 
    def meth(x: 0, y: 0, z: 0, **args)
      [x, y, z, args]
    end
    
    p meth(z: 4, y: 3, x: 3)
    p meth(x: 2, foo: 3, zoo: 4)
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ 
    

     关键字参数与普通参数搭配使用

    def func(a, b: 1, c: 2)

     ...

    end

    调用方法 func(1, b: 2, c: 3)

    用散列传递参数,只能用冒号形式的,这个比Python方便

    0
    146
    16
    52
    60
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ cat area2.rb 
    def area2(x: 0, y: 0, z: 0)
      xy = x * y
      yz = y * z
      zx = z * x
      (xy + yz + zx) * 2
    end
    
    p area2
    p area2(x: 2, y: 5, z: 9)
    p area2(x: 2, z: 4)
    
    args1 = {x: 2, y: 3, z:4}
    args2 = {x: 5, y: 6}
    p area2(args1)
    p area2(args2)
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ 
    

    方法调用的一些补充

    1 数组解包传参

    这个通过*解包,跟Python一样

    2把散列作为参数传递(作为普通参数传参)

    用{~}这样的形式来表示散列,将散列作为参数传递给方法时可以省略{}

    {"a"=>1, "b"=>2}
    {:arg=>3, :var=>5} 
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ cat foo.rb 
    def foo(arg)   # 普通参数入参
      arg
    end
    
    p foo("a" =>1, "b"=> 2)    # 看着有逗号,起始是一个参数
    p foo(arg: 3, var: 5)
    shijianzhongdeMacBook-Pro:chapter_7 shijianzhong$ 
    

    日常使用中,应该多用关键字参数    变量名:默认参数   这种

    Ruby缩进2个空格

  • 相关阅读:
    mysql重复数据下,删除一条重复数据
    Mysql常用函数
    鼠标滑至某位置,在鼠标旁边出现详情弹窗div
    限制文本框只能输入正数,负数,小数
    JAVA中split对空串的影响。
    《JAVA与模式》之简单工厂模式 (转)
    linux 常用命令汇总
    《JAVA与模式》之责任链模式
    《JAVA与模式》之模板方法模式 (转)
    java 异常汇总
  • 原文地址:https://www.cnblogs.com/sidianok/p/12981782.html
Copyright © 2020-2023  润新知