首页 > 学院 > 开发设计 > 正文

Ruby 基础语法

2019-11-10 18:12:02
字体:
来源:转载
供稿:网友

在 Ruby 中,一切皆对象,包括字符串和 nil 都是。

字符串

"foo" + "bar" # 字符串拼接=> "foobar"first_name = "Michael" # 变量赋值"#{first_name} Hartl" # 字符串插值 #{变量名}=> "Michael Hartl"# 关于单双引号Ruby 不会对单引号字符串进行插值操作 "foobar".length # 获取字符串长度=> 6

ruby中自带函数

# 是否为空 empty? 方法# 注意,empty? 方法末尾有个问号,这是 Ruby 的约定,说明方法返回的是布尔值,即 true 或 false。"foobar".empty?=> false"".empty?=> true# if else 用法if s.nil? "The variable is nil"elsif s.empty? "The string is empty"elsif s.include?("foo") "The string includes 'foo'" # 是否包含 'foo'end=> "The string includes 'foo'"# &&(与)、||(或)和 !(非)运算符x = "foo"y = ""puts "Both strings are empty" if x.empty? && y.empty?=> nilputs "One of the strings is empty" if x.empty? || y.empty?=> "One of the strings is empty"=> nilputs "x is not empty" if !x.empty?=> "x is not empty"=> nil# to_s 方法基本上可以把任何对象转换成字符串nil.to_s=> ""nil.empty?NoMethodError: undefined method `empty?` for nil:NilClassnil.to_s.empty? # 消息串联=> true# 测试对象是否为空"foo".nil?=> false"".nil?=> falsenil.nil?=> true# if 关键词 用法 表达式为真值时才执行的语句# 还有个对应的 unless 关键字也可以这么用puts "x is not empty" if !x.empty?string = "foobar"puts "The string '#{string}' is nonempty." unless string.empty?

nil 对象的特殊性,除了 false 本身之外,所有 Ruby 对象中它是唯一一个布尔值为“假”的。 我们可以使用 !!(读作“bang bang”)对对象做两次取反操作,把对象转换成布尔值:

!!nil=> false

除此之外,其他所有 Ruby 对象都是“真”值,数字 0 也是:

!!0=> true

数组

# 字符串转为数组 split "foo bar baz".split # 把字符串拆分成有三个元素的数组=> ["foo", "bar", "baz"]# 根据字符 转化"fooxbarxbazx".split('x')=> ["foo", "bar", "baz"]a = [42, 8, 17]a[0] # Ruby 使用方括号获取数组元素=> 42a[-1] # 索引还可以是负数=> 17a.first=> 42a.second=> 8a.last == a[-1] # 用 == 运算符对比 != | > | < | <= | >==> true# 求数组长度x = a.length # 和字符串一样,数组也可以响应 length 方法=> 3a.empty?=> falsea.include?(42) # 是否存在42这个值=> truea.sort # sort 升序排序=> [8, 17, 42]a.reverse # 数组反转 | 字符串反转 也是这个=> [17, 8, 42]a.shuffle # shuffle 随机排序=> [17, 42, 8]# 修改数组中值的顺序[改变key值],加上 !a.sort!# 向数组中追加元素a.push(6) # 把 6 加到数组末尾=> [42, 8, 17, 6]a << 7 # 把 7 加到数组末尾=> [42, 8, 17, 6, 7]a << "foo" << "bar" # 串联操作=> [42, 8, 17, 6, 7, "foo", "bar"]# join 数组转化为字符串 与 split 相反a.join # 没有连接符a.join(', ') # 连接符是一个逗号和空格

值域

# 值域(range)0..9# 转为数组 to_a (0..9).to_a # 调用 to_a 时要用括号包住值域=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 值域也可以使用字符串定义('a'..'e').to_a=> ["a", "b", "c", "d", "e"]# 值域经常用于获取数组的一组元素a = %w[foo bar baz quux] # %w 创建一个元素为字符串的 数组=> ["foo", "bar", "baz", "quux"]a[0..2]=> ["foo", "bar", "baz"]# 获取2至数组最后一位的元素a[2..(a.length-1)] # 显式使用数组的长度=> [2, 3, 4, 5, 6, 7, 8, 9]a[2..-1] # 小技巧,索引使用 -1=> [2, 3, 4, 5, 6, 7, 8, 9]

# 遍历(1..5).each { |i| puts 2 * i }246810=> 1..5# 说明 -------在值域 (1..5) 上调用 each 方法,然后又把 { |i| puts 2 * i } 这个块传给 each 方法。|i| 两边的竖线在 Ruby 中用来定义块变量。只有方法本身才知道如何处理后面跟着的块。这里,值域的 each 方法会处理后面的块,块中有一个局部变量 i,each 会把值域中的各个值传进块中,然后执行其中的代码。花括号是表示块的一种方式,除此之外还有另一种方式:# ------------(1..5).each do |i| puts 2 * iend# 结果和上面的一样## 块中的内容可以多于一行,而且经常多于一行。## 当块只有 一行简单的代码时 使用 花括号 形式;## 当块是一行很长的代码,或者有多行时使用 do..end 形式:(1..5).each do |number| puts 2 * number puts '-'end# 其他遍历3.times { puts "Betelgeuse!" } # 3.times 后跟的块没有变量"Betelgeuse!""Betelgeuse!""Betelgeuse!"=> 3(1..5).map { |i| i**2 } # ** 表示幂运算=> [1, 4, 9, 16, 25]%w[a b c] # 再说一下,%w 用于创建元素为字符串的数组=> ["a", "b", "c"]%w[a b c].map { |char| char.upcase }=> ["A", "B", "C"]%w[A B C].map { |char| char.downcase }=> ["a", "b", "c"]# 简写%w[A B C].map(&:downcase)=> ["a", "b", "c"]

散列[关联数组]和符号

user = {} # {} 是一个空散列=> {}user["first_name"] = "Michael" # 键为 "first_name",值为 "Michael"=> "Michael"user["last_name"] = "Hartl" # 键为 "last_name",值为 "Hartl"=> "Hartl"user["first_name"] # 获取元素的方式与数组类似=> "Michael"user # 散列的字面量形式=> {"last_name"=>"Hartl", "first_name"=>"Michael"}# => 创建散列user = { "first_name" => "Michael", "last_name" => "Hartl" }=> {"last_name"=>"Hartl", "first_name"=>"Michael"}# 在 Rails 中用符号(Symbol)做键很常见。符号看起来有点儿像字符串,只不过没有包含在一对引号中,# 而是在前面加一个冒号。例如,:name 就是一个符号。你可以把符号看成没有约束的字符串# 符号是 Ruby 特有的数据类型.user = { :name => "Michael Hartl", :email => "michael@example.com" }=> {:name=>"Michael Hartl", :email=>"michael@example.com"}user[:name] # 获取 :name 键对应的值=> "Michael Hartl"user[:passWord] # 获取未定义的键对应的值=> nil# 散列的第二种表示方式{ name: "Michael Hartl", email: "michael@example.com" }# 在散列字面量中,:name => 和 name: 作用一样。# 如果要表示符号,只能使用 :name(冒号在前面)。# 嵌套散列params = {} # 定义一个名为 params(parameters 的简称)的散列=> {}params[:user] = { name: "Michael Hartl", email: "mhartl@example.com" }=> {:name=>"Michael Hartl", :email=>"mhartl@example.com"}params=> {:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}}params[:user][:email]=> "mhartl@example.com"# 散列响应遍历Flash = { success: "It worked!", danger: "It failed." }flash.each do |key, value| puts "Key #{key.inspect} has value #{value.inspect}"end

参考: https://railstutorial-china.org/book/chapter4.html https://www.railstutorial.org/book/rails_flavored_ruby


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表