zoukankan      html  css  js  c++  java
  • 总结:Ruby中的@ % # $等各种千奇百怪的符号的含义等

    初学RUBY时,一看各种稍微复杂一点的代码时很容易被RUBY各种约定的表示方法搞晕,这整理一下 。


    (若标识符首位是小写字母或“_”,则该标识符就是局部变量或方法调用。)

    (以大写字母([A-Z])开始的标识符是常数、类名或者模块名)

    以@开始的变量是实例变量,它属于特定的对象。可以在类或子类的方法中引用实例变量。

    若引用尚未被初始化的实例变量的话,其值为nil。Ruby的实例变量无须声明,每个实例变量都是在第一次出现时动态加入对象。Ruby的实例变量通常在方法中定义类声明——当在方法里声明实例变量时,该实例变量实际上属于该方法所在类的实例,而不是属于该方法。例如

    class Apple     
        # 定义第一个方法     
        def info1     
            # 输出实例变量@a     
            puts @a    
        end    
        # 定义第二个方法     
        def info2     
            # 为实例变量赋值     
            @a = "Hello";     
        end    
    end    
    # 创建Apple类实例     
    apple = Apple.new    
    # 调用方法     
    apple.info2     
    apple.info1  
    

    以@@开始的变量是类变量。在类的定义中定义类变量,可以在类的特殊方法、实例方法等处对类变量进行引用/赋值:

    class Foo
      @@foo = 1
      def bar
        puts @@foo
      end
    end
    

    类变量与常数的区别如下。

    • 可以重复赋值(常数则会发出警告)
    • 不能在类的外部直接引用(在继承类中则可以引用/赋值)

    类变量与类的实例变量的区别如下。

    • 可在子类中引用/赋值
    • 可在实例方法中引用/赋值

    可以把类变量看作一种被类、子类以及它们的实例所共享的全局变量。

    class Foo
      @@foo = 1
    end
    class Bar < Foo
      p @@foo += 1          # => 2
    end
    class Baz < Bar
      p @@foo += 1          # => 3
    end
    

      

    模块中定义的类变量(模块变量)被所有包含该模块的类所共享。

    module Foo
      @@foo = 1
    end
    class Bar
      include Foo
      p @@foo += 1          # => 2
    end
    class Baz
      include Foo
      p @@foo += 1          # => 3
    end
    

      

    以$开始的变量是全局变量,可以在程序的任何地方加以引用(因此需要特别留意)。全局变量无需变量声明。引用尚未初始化的全局变量时,其值为 nil。

      

    %表示法(百分号表示法):

    %{String}  用于创建一个使用双引号括起来的字符串 
    %Q{String} 用于创建一个使用双引号括起来的字符串 
    %q{String} 用于创建一个使用单引号括起来的字符串 
    %r{String} 用于创建一个正则表达式字面值 
    %w{String} 用于将一个字符串以空白字符切分成一个字符串数组,进行较少替换 
    %W{String} 用于将一个字符串以空白字符切分成一个字符串数组,进行较多替换 
    %s{String} 用于生成一个符号对象 
    %x{String} 用于执行String所代表的命令 

    "%05d" % 123 » "00123"

    "%-5s: %08x" % [ "ID", self.id ] » "ID:200e1670"


    # 用来调用一个方法,


    *号:

    若左边最后一个表达式前带*的话,则将右边多余的元素以数组的形式代入这个带*的表达式中。若右边没有多余元素的话,就把空数组代入其中。

    *foo     = 1, 2, 3      # foo = [1, 2, 3]
    foo,*bar = 1, 2, 3      # foo = 1; bar = [2, 3]
    

    *用在方法定义中表示可变长的变量:

    【FROM “ProgrammingRuby”】

    Variable-Length Argument Lists 

    But what if you want to pass in a variable number of arguments, or want to capture multiple arguments into a single parameter? Placing an asterisk before the name of the parameter after the ``normal'' parameters does just that.

    def varargs(arg1, *rest)
        "Got #{arg1} and #{rest.join(', ')}"
    end
    varargs("one") » "Got one and "
    varargs("one", "two") » "Got one and two"
    varargs "one", "two", "three" » "Got one and two, three"
    
    irb(main):005:0> def call_back(*a)
    irb(main):006:1> a.each do |arg|
    irb(main):007:2*    puts  arg
    irb(main):008:2> end
    irb(main):009:1> end
    => nil
    irb(main):011:0> call_back(["hello",99])
    hello
    99
    => [["hello", 99]]
    irb(main):012:0> call_back(["hello",99],"hello",99)
    hello
    99
    hello
    99
    => [["hello", 99], "hello", 99]
    

      

      

    其他用法:

    C:\Users\Administrator>irb
    irb(main):001:0> [1,2,3] * "hi"
    => "1hi2hi3"
    irb(main):002:0> [1,2,3] * ";"
    => "1;2;3"
    irb(main):003:0> [1,2,3] * 3
    => [1, 2, 3, 1, 2, 3, 1, 2, 3]
    irb(main):004:0> "hi" * 3
    => "hihihi"


  • 相关阅读:
    VirtualBox 下USB 设备加载的步骤及无法加载的解决办法
    浅析:setsockopt()改善socket网络程序的健壮性
    减小Gcc编译程序的体积
    linux下查看系统进程占用的句柄数
    Linux下高并发socket最大连接数所受的各种限制
    spring-jpa通过自定义sql执行修改碰到的问题
    阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
    sql select时增加常量列
    CASE WHEN 及 SELECT CASE WHEN的用法
    MYSQL常见运算符和函数
  • 原文地址:https://www.cnblogs.com/likeyu/p/2363912.html
Copyright © 2011-2022 走看看