zoukankan      html  css  js  c++  java
  • 《Rubu基础教程第五版》第九章笔记 运算符

    赋值运算符

    += -+这种,跟Python基本一样的操作

    逻辑远算符的应用

    首先这里有着很多编程语言独有的短路原则,这个不讲了

    概念上一下

    表达式的执行顺序是从左到右

    如果逻辑表达式的真假已经可以确定,则不会在判断剩余的表达式(短路原则)

    最后一个表达式的值为整体逻辑表达式的值

    item = arry && arr.first

    还有一种写法为 item = arr&.first 中间没有空格

    这个叫做安全运算符,或nil检查方法调用,arry不是nil或者false item的arr.first

    var ||= 1

    var = var || 1, 这个也非常由意思,是一个nil 或者 false给予默认值的写法,var由值的化,就不会进行赋值

    条件运算符,Python中的三元表达式

    条件 ? 成立的表达式: 不成立的表达式

    a = 1

    b = 2

    max =  a > b ? a : b

    python的写法 max = a if a > b else b

    范围运算符

    可以用过Range.new

    irb(main):015:0> Range.new(1,5).each {|n| p n}
    1
    2
    3
    4
    5
    => 1..5
    

     首位都可以取到,跟Python完全不一样

    也可以用过(1..5)或者(1...5)多一个点表示尾部的数字取不到

    通过to_a的方式,可以将range转换成array

    irb(main):016:0> (1..3).to_a
    => [1, 2, 3]
    irb(main):017:0> (1...3).to_a
    => [1, 2]
    irb(main):018:0> 
    

     还可以定义字符串的列表

    irb(main):018:0> ("A".."D").to_a
    => ["A", "B", "C", "D"]
    irb(main):019:0> ("A"..."D").to_a
    => ["A", "B", "C"]
    irb(main):020:0> 
    

    对象通过succ的方法,可以根据起点逐个生成接下来的值

    irb(main):020:0> val = "a"
    => "a"
    irb(main):021:0> val = val.succ
    => "b"
    irb(main):022:0> val = val.succ
    => "c"
    irb(main):023:0> val = val.succ
    => "d"
    irb(main):024:0> val = val.succ
    => "e"
    irb(main):025:0> 
    

    远算符优先级

    定义运算符,很多是不能定义的

    上能定义的二元远算符

    class Point
      attr_accessor :x, :y  # 定义存储器,可以对该属性进行读取,赋值
    
      def initialize(x=0.0,y=0.0)
        @x, @y = x, y
      end
      
      def inspect   # 相当于Python中__repr__
        "(#{x}, #{y})"
      end
    
      def +(other)
        self.class.new(x + other.x, y + other.y)
      end
      
      def -(other)
        self.class.new(x - other.x, y - other.y)
      end
      
    
      def swap(other)
        tem_x, tem_y = @x, @y
        @x, @y = other.x, other.y
        other.x, other.y = tem_x, tem_y  # 在同一个类中调用protected方法
        self
      end
    end
    
    p0 = Point.new
    p1 = Point.new(1.0, 2.0)
    
    p [p0.x, p0.y]
    p [p1.x, p1.y]
    
    p p0 - p1
    p p0 + p1
    

    每个对象都由to_s与inspect的方法默认,相当与Python的str与erpr函数的调用

    一元运算符 +- ~!分别以+@、-@,~@、!@为方法来定义

    这个不写了

    定义下标方法 相当于Python中的__getitem__与__setitem__

    class Point
      attr_accessor :x, :y  # 定义存储器,可以对该属性进行读取,赋值
    
      def initialize(x=0.0,y=0.0)
        @x, @y = x, y
      end
      
      def inspect   # 相当于Python中__repr__
        "(#{x}, #{y})"
      end
    
      def +(other)
        self.class.new(x + other.x, y + other.y)
      end
      
      def -(other)
        self.class.new(x - other.x, y - other.y)
      end
      
      def [](index)  # 读操作
        case index
        when 0
          x
        when 1
          y
        else
          raise ArgumentError, "out of range '#{index}'"
        end
      end
    
      def []=(index, value)
        case index
        when 0
        self.x = value
        when 1
        self.y = value
       else
         raise ArgumentError, "out of range '#{index}'"
       end
      end
    
    
      def swap(other)
        tem_x, tem_y = @x, @y
        @x, @y = other.x, other.y
        other.x, other.y = tem_x, tem_y  # 在同一个类中调用protected方法
        self
      end
    end
    
    p0 = Point.new
    p1 = Point.new(1.0, 2.0)
    
    p [p0.x, p0.y]
    p [p1.x, p1.y]
    
    p p0 - p1
    p p0 + p1
    
    
    p p0[0]
    p p0[1] = 3
    p p0[1]
    p p0[2]
    

    方法的定义,Ruby好多了,不用取记很多Python中的所谓的魔法方法

  • 相关阅读:
    0102-进程操作(面向对象简单工厂模式,打开输入文件)
    0101-进程操作(变量命名)
    win10无法成功完成操作因为文件包含病毒或潜在的垃圾软件如何处理
    序列化和反序列化
    __slot__的用法
    python中typeguard包
    pandas如何将多个DataFrame写入同一个excel工作簿中
    DEAP库遗传算法
    【教程】如何把喜马拉雅音频下载到电脑
    oracle安装路径查看方式
  • 原文地址:https://www.cnblogs.com/sidianok/p/13022847.html
Copyright © 2011-2022 走看看