Ruby基本语法
更新: 2017/06/09
更新: 2017/06/20 cattr_accessor定义类变量,相当于@@
更新: 2017/06/23 生成类的实例
更新: 2017/06/24 补充loop的说明
更新: 2017/09/07 增加each_with_index, each.with_index(offset = 0)
更新: 2017/09/28 增加了when的条件句的复合写法
更新: 2017/10/28 加粗了类中常量读取,并补充了不能代入两次
增加单行的if简写
更新: 2018/02/28 优化了表格的宽度与列数
更新: 2019/03/30 补充类变量无法从类外部参照, 常数可以
Ruby里大致有三种条件分支语法
| 句法 | |
| require "..." | 从默认位置引用库 |
| require_relative "..." | 从当前位置引用库 |
| 变量 | |
| 本地变量 | 小字母开头或_开头 a, _a |
| 全局变量 | $开头 $a |
| 实例变量 | @开头 相当于其他语言的类变量 在任何一处地方创建整个类里共享 attr_reader attr_writer attr_accessor |
| 类变量 |
@@开头 ● 无法从类外部参照
|
| 常量 |
大字母开头, 如A, TEMP
|
| access修饰 | |
| public | |
| private | |
| protected | |
| 方法定义 | def hello(name) ... end 注意: 指定默认值方法如下 def hello(name = "default") return 回值,后面没东西返回nil 默认返回最后一个值 不带参数可以省略括号或者用空括号 不固定长度的参数def test(*arg) |
| 可带标签 | def test(a: 0, b: 0, c: 0) ... end def convert(origin, to: 0) origin = to end |
| 静态方法 | class << class-name ...(defination) end 上面这个也可以用来加函数到实例里去 或者 def class-name.method(...) ... end 如在类中则可 def self.method(...) |
| 方法改名与删除 | alias undef |
| 类定义 | class ... ... end 注: 类名要常量(首字母大写) 类中常数用class-name::const-name来读取 |
| 类扩张 | 和类定义已将 class ... ... end |
| 类继承 inheritance |
class ... <
... def initialize(value) super(value) end ... end |
| 类的文字输出 | 就是p(自定义的数据结果)时会输出的结果 def inspect() return "..." end |
| 生成类的实例 | Class Sample ... end Sample.new(...) Sample.create(...) |
| 属性的访问限制 | |
| attr_reader | 从外部可读 类的变量 |
| attr_writer | 从外部可写 类的变量 |
| attr_accessor | 从外部可读写 类的变量 |
| 方法的访问限制 | |
| public | 对外部公开 |
| private | 对外部保密 |
| protected | 只能从自己这个类以及自己的类的实例访问 |
| 模块 | 不能带数据 module ... ... end |
| 模块使用 | include module-name 或 class-name/instance-name.extend(module-name) 静态方法还可以 extend module-name |
| 查看是否包含模块 | MyThird.include?(SayHello) |
| 查看祖先 | MyThird.ancestors() |
| 查看直接母类 | MyThird.superclass() |
| 三种条件分支 | |
| if ... (then) ... elsif ... (then) ... else ... (then) ... end |
(then)可省略 .... if 条件 式 if 式 右边成立则运行左边 |
| unless ... (then) ... else ... end |
条件不成立时运行unless部分 |
| case a when ... (then) ... when ... (then) ... when ... (then) ... else ... end |
就是其他语言的Switch 注意,多个条件可以用逗号分隔 when 1, 2, 3, .... ... end |
| 6种循环语句 | break next 相当于其他语言的continue redo 基本不用 |
| times | n = 5 n.times do |temp| ... end |
| for | for i in 0..4 ... end |
| while | while ... ... end |
| until | 和while相反 |
| each | range = 1..10 range.each do ... end 增加从0开始的索引 range.each_with_index do ... end 增加任意索引 range.each.with_index(n) do ... end |
| loop | loop do ... end 无限循环,可用来实现其他语言的do {} while(); |
| 异常处理 | begin ... rescue ... ensure ... end begin ... rescue exA1, exA2 ... => ... ... rescue exB1, exB2 ... => ... ... . . . . ensure ... end 注: $! 最后发生的异常 $@最后发生的异常的位置 ensure 记录最后一定要执行的部分 retry 重试 sleep n 暂停n秒 raise 发出异常 raise ex-class message 例外对象的方法 class 异常种类 message 异常信息 backtrace 异常位置信息(和$!.backtrace相同) |
| 类似Swift ??的用法 | a = Integer("abc") rescue 123 |
| 运算符 | |
| 范围 | Range.new(1, 10) |
| 重载 | def +(rhs) ... end |
| 单项运算法重载 | 只可以+, -, ~, ! |
| 代码块 | do |a, b, c, ...| ... end 注: redo返回时候一切回到进入redo的那次循环最开始 |
| 运行代码块 | def ... ... yield ... end |
| 检验是否有代码块 | block_given? |
| 代码块类 | sayHello = Proc.new() do |name| ... end 执行 sayHello.call("WACQY") |
| 有代码块的方法 | def sample(a, b, &method) ... block.call(method) ... end 注: 带入现成代码块要加& sample(3, 4, &sayHello) |
对错判断
| 判断 | |
| true false | 不解释 |
| 其他 | false和nil为伪, 其他都为真 |
谜之编译:
临时发现的,不知道什么鬼。先记下来。以后懂了再写
a = 0
while a <= 10
case a
when 0 then
puts("a is 0")
when 1 then
puts("a is 1")
when a > 1 && a <= 10
puts("catch a")
end
a += 1
end
运行结果

浙公网安备 33010602011771号