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
运行结果