美文网首页
Ruby 语法(基础)

Ruby 语法(基础)

作者: _西风凋碧树 | 来源:发表于2019-04-11 09:13 被阅读0次

1.关键字,标识符,注释

Ruby保留字

下表列出了 Ruby 中的保留字。这些保留字不能作为常量或变量的名称。但是,它们可以作为方法名。

BEGIN do next then
END else nil true
alias elsif not undef
and end or unless
begin ensure redo until
break false rescue when
case for retry while
class if return while
def in self _FILE_
defined? module super _LINE_

Ruby标识符

标识符是变量、常量和方法的名称。Ruby 标识符是大小写敏感的。这意味着 Ram 和 RAM 在 Ruby 中是两个不同的标识符。

Ruby 标识符的名称可以包含字母、数字和下划线字符( _ )。

Ruby变量命名

  • 局不变量小写字母下划线开头
  • 全局变量以$开头
  • 实例变量@开头
  • 类变量@@开头
  • 常量 大写字母
  • 类名 大驼峰

Ruby基本类型

数字、字符串、数组、符号、散列表、区间、正则表达式

基本类型 对应类
数字 [[Fixnum、Bignum]=>Integer、Float,Complex]=>Numeric
字符串 String
数组 Array
符号 Symbol
散列表 Hash
区间 Range
正则表达式 Regexp

运算符优先级

运算符 说明
[]、[]= 数组下标,数据元素赋值
** 乘幂
!、~、+、- 非、位非、一元加、一元减
*、/、% 乘、除、模
+、- 加、减、
>>、<< 右移、左移
& 位与
^、| 位异或、位或
<=、<、>、>= 比较运算符
<=>,==,===,=,!=,! 各种相等判断
&&、and 逻辑与
||、or 逻辑或
..、... 区间开始点到结束点
? : 三元运算 (a==1?'true':'false')
=、%=、~=、/=、-=、+=、|=、&= 、>>=、<<=、=、&&=、||=、*= 各种赋值运算符
defined? 检查是否定义
not 逻辑非 等价!
if unless while until 表达式和修饰符
begin/end Block 表达式

流程控制

1.条件控制
# if else 示例
if a<10
  puts 'a小于10'
elsif a<20
  puts 'a大于等于10,小于20'
else
  puts 'a大于30'
end
# unless 示例
unless a<10
  puts 'a小于10'
else
  puts 'a大于等于10'
end
# case示例
case a.class.name
when 'String'
  puts 'a为字符串'
when 'Fixnum','Bignum','Float'
  puts 'a为数字'
when 'Array'
  puts 'a为数组'
else
  puts “a为#{a.a.class.name}”
end
2.循环控制
# while 示例
i = 0
while i<10
  puts i
  i+=1
end

# until 示例
i = 0
until i>10
  puts i
  i += 1
end

# for 示例
for i in [1,2,3,4,5]
  puts i
end

# 使用区间
for i in (1..10)
  puts i
end
# each 示例
(1..10).each do |i|
  puts i
end
# 改变循环过程
# break 跳出整个循环
(1..10).each do |i|
  puts i
  break if i>=5
end

# next 跳出当前循环
(1..10).each do |i|
  next if i%2 == 0
  puts i
end

2.Ruby中的面向对象

定义类和构造函数

定义类方法实例方法
class MyClass
  # 定义类方法
  def self.method1
    puts 'method1'
  end
  
  # 另一种定义类方法
  def MyClass.Method2
    puts 'method2'
  end
  
  # 定义实例方法
  def methods3
    puts 'methods3'
  end 
end

my_class = MyClass.new
my_class.method3
MyClass.method1
MyClass.method2
# method3 实例方法会报错
MyClass.method3 

定义属性

attr、attr_reader、attr_writer、attr_accessor

attr 在缺省的情况下等价于attr_reader

可通过 attr(symbol,writable = false) 设置是否可写

attr(:attr1,true) 等价于 attr_accessor :attr1

class MyClass
  # 使用attr_accessor 定义attrl
  attr_accessor :attr1
  # 使用方法定义 attr2 属性
  def attr2
    @attr2
  end
  def attr2=(value)
    @attr2 = value
  end
end

my_class = MyClass.new
my_class.attr1 = 'attr1'
puts my_class.attr1

my_class.attr2 = 'attr2'
puts my_class.attr2


访问控制

public(公有)、protected(保护)、private(私有)

  • Public 可被任何人调用,没有任何访问限制,通常默认级别就是公有的
  • Protected 只能被定义该方法的类及其子类调用
  • Private 区别于protected 是不能被明确的接受者调用,只能被self调用
class MyClass
  # 默认是public
  def public_method
    puts 'public_method'
  end
  
  protected
  def protected_method
    puts 'protected_method'
  end
  
  private
  def privated_method
    puts 'privated_method'
  end
  
  public
  def public_method
    puts 'public_method'
  end
end

class MySubClass < MyClass
  # 子类可以在内部使用父类中的protected和provate的方法
  def call_protected_method
    protected_method
  end  
  def call_private_method
    private_method
  end
end

#protected 和 private 区别
class MyClass
    def initialize(name)
        @name = name
    end

    def compare(c)
        c.name == @name
    end

    protected  # 换成private 会报错
    # private
    def name
        @name
    end  
end

a = MyClass.new('a')
b = MyClass.new('a')
puts a.compare(b)

类变量实例变量
class MyClass
    @@instant_object_count = 0
    # 返回myclass的实例数量
    def self.instant_object_count
        @@instant_object_count
    end
    # 返回实例对象的序号
    def object_index
        @instant_object_index
    end

    # 实例方法返回myclass的所有实例数量
    def object_count
        @@instant_object_count
    end
    # 初始化实例函数
    def initialize
        # 创建新实例对象时,类变量计数器+1,并把标记变量给实例变量
        @@instant_object_count = @@instant_object_count +1
        @instant_object_index = @@instant_object_count
    end
end
my_class1 = MyClass.new
puts "现在有#{my_class1.object_count}个实例"
my_class2  = MyClass.new
puts "现在有#{my_class1.object_count}个实例"
puts "class1的序号#{my_class1.object_index}"
puts "class2的序号#{my_class2.object_index}"

输出:
现在有1个实例
现在有2个实例
class1的序号1
class2的序号2

类的扩展和继承
# 扩展实例的方法
class Fixnum
    # 添加一个实例方法
    def speak
        puts "我的值#{self}"
    end
    # 覆盖旧的abs方法
    def  abs
        puts "abs不能用了"
    end
end

# 扩展类方法
def Fixnum.say_hello
    puts 'Hello!'
end

# 批量扩展类方法
class << Fixnum
    def say_hello_again
        puts "Hello again!"
    end
end

1.speak
-1.abs
Fixnum.say_hello
Fixnum.say_hello_again


# 类的继承
class Person
    attr_accessor :name, :age

    def say_hello
        puts "你好,我是#{self.name}"
    end
    
    def say_age
        puts "我的年龄是#{self.age}"
    end
end

class Man < Person
    def sex
        return "男"
    end

    def say_sex
        puts "我的性别是#{self.sex}"
    end

    def say_hello
        super
        say_age
        say_sex
    end
end

man = Man.new
man.name = "张三"
man.age = 22
man.say_hello

别名
class Fixnum
    # 创建一个+方法的别名
    alias plus +
    def +(value)
        return self.plus(value*2)
    end
end

puts 1.plus(1) # 结果为2

puts 1+1 # 结果为3

复制、冻结对象

dum和clone都是浅复制,如果对象还包含了对其他对象的引用,将不会复制这些包含的对象,而只复制他的引用

class MyClass
    attr_accessor :value
end
a = MyClass.new
# 冻结a
a.freeze
# 下面代码会出错
def a.new_method
    puts "变量a的新方法"
end


a = "text"
a.freeze

a<<"a" # 会报错 
a = a+"a" # 不会报错 a将是一个新的对象

对象的序列化
class MyClass
    attr_accessor :value
end

a = MyClass.new
a.value = 1

# 获取a的序列化字符
dump_copy = Marshal.dump(a)
# 通过序列化字符重建对象
b = Marshal.load(dump_copy)

puts b.class
puts b.value

相关文章

  • 《Ruby~笔记》0x03

    Ruby 基础语法及应用 IRB (Interactive ruby) 类似与 python shell prin...

  • Ruby 语法(基础)

    1.关键字,标识符,注释 Ruby保留字 下表列出了 Ruby 中的保留字。这些保留字不能作为常量或变量的名称。但...

  • CocoaPods之Podfile\Podfile.lock

    什么是Podfile ? CocoaPods是用ruby实现的,因此Podfile文件的语法就是ruby的语法。p...

  • Ruby基础知识-基础解释

    Ruby基础知识-基础解释 ruby相关的命令行ruby命令行

  • ruby 语法

    hello ruby 新建一个test.rb文件,在里面加一条 puts 'hello ruby',终端执行,ru...

  • ruby 语法

    1. Here Document: 多行字符串 2. BEGIN 语句 声明 code 会在程序运行之前被调用。 ...

  • [Ruby]语法

    所有的 Ruby 文件扩展名都是.rb 运行文件 $ rubytest.rb Ruby 程序中的空白 在 Ruby...

  • 初识Ruby

    Ruby MRI : Ruby官方解释器 安装 Linux 基本语法 irb :进入Ruby命令行环境 puts和...

  • 【rails学习笔记2】ruby基础语法

    一 ruby是一门面向对象的语言 在建模过程中,分析要表达的事物,将他们归类,抽象为对象,同时赋予他们一定的成员变...

  • 【rails学习笔记3】ruby基础语法

    一 类 有一个值得注意的地方是,这里的class order并不是和java语言一样是声明一个类,而是调用方法,...

网友评论

      本文标题:Ruby 语法(基础)

      本文链接:https://www.haomeiwen.com/subject/yajziqtx.html