总结:Ruby中的@ % # $等各种千奇百怪的符号的含义等
- 2018-01-27 08:47:00
- zstmtony 转贴
- 3544
总结:Ruby中的@ % # $等各种千奇百怪的符号的含义等
初学RUBY时,一看各种稍微复杂一点的代码时很容易被RUBY各种约定的表示方法搞晕,这整理一下 。
(若标识符首位是小写字母或“_”,则该标识符就是局部变量或方法调用。)
(以大写字母([A-Z])开始的标识符是常数、类名或者模块名)
以@开始的变量是实例变量,它属于特定的对象。可以在类或子类的方法中引用实例变量。
若引用尚未被初始化的实例变量的话,其值为nil。Ruby的实例变量无须声明,每个实例变量都是在第一次出现时动态加入对象。Ruby的实例变量通常在方法中定义类声明——当在方法里声明实例变量时,该实例变量实际上属于该方法所在类的实例,而不是属于该方法。例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Apple
# 定义第一个方法
def info1
# 输出实例变量@a
puts @a
end
# 定义第二个方法
def info2
# 为实例变量赋值
@a = "Hello";
end
end
# 创建Apple类实例
apple = Apple.new
# 调用方法
apple.info2
apple.info1
|
以@@开始的变量是类变量。在类的定义中定义类变量,可以在类的特殊方法、实例方法等处对类变量进行引用/赋值:
1
2
3
4
5
6
|
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"
联系人: | 王先生 |
---|