Ruby 趣学笔记(一)

这篇具有很好参考价值的文章主要介绍了Ruby 趣学笔记(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Ruby 趣学笔记(一)

本文写于 2020 年 5 月 6 日

  • Ruby 趣学笔记(一)
    • 变量
      • 变量声明
      • 变量类型
    • 常量
    • 输出
    • 字符串
    • 字符串操作
    • Array
      • 数组的遍历
      • 数组的连接
      • 怎么判断该变量是否是数组
    • 函数
      • 普通函数
      • 传参的函数
      • 解包参数
      • 部分参数解包
      • 参数的默认值
      • 传入一个散列
    • class
      • class 下面有啥方法?
      • 如何判断这个方法是否存在呢?

最近在 mac 上探索到了 homebrew 的使用方法,对 ruby 的兴趣直线上升,所以来学一学。

最近几年确实大家一直在唱衰 Ruby,整个社区的生态确实也不如 python 那么庞大,但是这都不妨碍 ruby 被称作“快乐编程”。

这几年越来越强调语言的性能,但是 Ruby 的作者松本行弘却认为,人才是最重要的!

自看到这句话的第一眼,我就深以为同!

其实这就是一个价值观的问题:人更值钱,那么就应该尽量节省人力;机器算力更值钱,那么就应该用人力去优化程序,来节省机器的算力。但是国内的大环境大家也懂,人多爆了......

自然而然,从上面的结论来看,Ruby 在国内不会流行。

作为多范式编程语言,Ruby 会比 Java 等更难协作;作为解释型语言,运行速度肯定比不上 C++ 超级慢……可很多人对于 Ruby 的评价仍然是:程序员的一把尖刀!

并且在 web 开发领域,还有一些大公司(GitHub)坚持在使用 Ruby,这足以说明 Ruby 的强大了!

变量

变量声明

Ruby 的变量声明不需要关键字,也不需要类型信息。

message = 'hello world'
_num = 0

$h = [1, 2, 3]

小写开头、_ 开头的变量是局部变量;$ 开头的单词是全局变量。

并且默认 Ruby 不存在闭包。

在函数内访问上级作用域的局部变量会报错。

变量类型

Ruby 不存在所谓的“基本类型”,比如 int / float / char...Ruby 只存在一个类型:对象。

一切皆对象的原则被严格恪守!我们可以不严谨的认为:Ruby 的类型就是对象。

什么意思呢?

print(1.to_s)

to_s 天生的就是 1 的方法!数字 1 其实就是 Number 对象的实例。

Ruby 的数据类型有 Number、String、Ranges、Symbols,以及 true、false 和 nil,以及 Array、Hash。

其中比较有意思的是 true 和 false,他们的 class 并不是 Boolean,而是 TrueClassFalseClass

甚至连 class 都有 class——Class

事实上,所有变量的 class 的 class,都是 Class 类。

常量

如同变量一样,Ruby 的常量声明也是通过约定。

所有首字母大写就代表常量,通常我们习惯将常量全大写(也有例如 GOLANG 以及一些其他语言推荐使用大驼峰命名)。

MAX_COUNT = 100

但 Ruby 毕竟还是个动态语言,即使是常量,我们也是可以强行修改的,只是会警告你而已。

MAX_COUNT = 100
MAX_COUNT = 101

p MAX_COUNT # 101

输出

Ruby 存在三种输出语句 print puts p

其中,p 语句的输出可以让我们看到更多的信息,例如

p "hello" # "hello"
puts "hello" # hello

p 可以让我们看到是否是字符串,puts 则不可以。

所以一般程序中输出时会用 p,日志输出用 printputs

字符串

Ruby 可以用单引号或者双引号标注字符串,单引号中不会自动将转义字符转义、双引号会自动转义。

p "a\nb" # 会换行
p 'a\nb' # 不会换行,直接输出 \n

双引号中还可以进行类似 JS 的模板字符串的插值:"hello #{userName}"

Ruby 也支持多行字符串。

str = <<fuck
1
2
3
3
fuck

<< 后跟上某一个字符串,直到遇见相同的字符串,多行字符串就会结束。

str = <<fuck
1
2
3
3fuck

但这种情况不会结束,所以结束符必须位于单行。

字符串操作

  • +:字符连接
  • <<:字符带入
  • *:字符循环
a = "hello";
b = "world";
puts a + " " + b;

# <<:字符带入
a << b
puts a
puts b

# 这个其实相当于 a = a + b

# *:字符循环
a = "A"
puts a * 4

Array

games = ['魔兽世界', '塞尔达传说', '金庸群侠传']
puts games

这个 games 的定义,如果你在 RubyMine 或者其他强大的 IDE 中编写,他就会告诉你,有更好的方式:games = %w[魔兽世界 塞尔达传说 金庸群侠传]

这就是为什么 Ruby 不易协作,一千个程序员有一千种写法与实现方法!

数组的遍历

这是永远的重点,编程中最为常用的方法。

Ruby 可以通过 each 来遍历数组,具体语法如下:

games.each do |game|
  puts "我喜欢#{game}"
end

这个地方稍微提一句,我曾在某个地方看到过,写单引号的程序最后会比写双引号的小(文件大小)。但是这里这种模板字符串的写法,必须要双引号。

带上数组下标的遍历

games.each_with_index do |game, i|
  puts "第#{i}个游戏是#{game}"
end

数组的连接

games.join(','),这个方法其实很多语言都有,可以返回一个由逗号连接的、由数组每个元素顺序组成的字符串。

怎么判断该变量是否是数组

这个怎么判断呢???

很简单,还是运用 respond_to?

怎么用?

刚刚的 each 方法就可以!

games.respond_to?('each') && puts '这是一个数组!'

函数

普通函数

def sayHello
  puts "Hello World."
end

sayHello() # Hello World.
sayHello # Hello World.

这里可以看到,Ruby 的函数既可以带括号的调用,也可以直接调用。

传参的函数

def sayHello(name)
  puts "Hello, #{name}."
end

解包参数

函数会自动解包传入的数组。

def foo(p1, p2, p3)
  p p1 + p2 + p3
end

foo [1, 2, 3]

注意,这种将数组解包的函数,如果传入的数组长度大于参数数量,那么会直接报错。

部分参数解包

传入的多余参数转化为数组。

def foo(base, *rest)
  rest.each do |item|
    base += item
  end

  return base
end

foo 1, 2, 3, 4, 5

*rest 参数可以不在末尾。

def foo(base, *rest, final)
  p base
  p rest
  p final
end

foo 1, 2, 3, 4, 5 # base 1, rest [2, 3, 4], final 5
foo 1, 2 # base 1, rest [], final 2
foo 1 # 报错

参数的默认值

def sayHello(name = 'world')
  puts "Hello, #{name}."
end

sayHello "啦啦啦"

传入一个散列

该形式必须提供默认值。

def sayHello(url: "", id: 0)
  puts "#{url}?id=#{id}."
end

sayHello url: "xxx", id: 5

这就类似于 JS 中的:

function foo({ a, b } = { a: 1, b: 1 }) {}

这种形式还可以直接传入一个散列,但是必须保证 key 类型是 Symbol 类型,String 或者其他类型都会导致报错:

h = {
  :p1 => 100,
  :p2 => 200
}

h_err = {
  'p1' => 100,
  'p2' => 200
}

class

让我们来定义一个手机类:

class Phone
  def initialize(brand = '苹果', name = '刘好', number = 15_527_782_945)
    @brand = brand
    @name = name
    @number = number
  end

  def call
    puts "#{@name}使用#{@brand}手机,拨打了#{@number}的号码。"
  end
end

iPhone = Phone.new

iPhone2 = Phone.new('三星', '王自如', 1123321)

与函数一样,class 实例化时调用 new 方法也不需要括号。

Ruby 管 @ 开头的变量叫做实例变量,@@ 开头的叫做类变量。但其实类似于 Java 的成员变量和静态成员变量。

但不同的是,Ruby 自带封装性。

实例变量默认外部不可以访问,需要我们自定义一下 getter/setter。

  • attr_accessor :xxx 为 getter/setter
  • attr_reader :xxx 为 getter
  • attr_writer :xxx 为 setter
class Game
    attr_accessor :price
    attr_reader :name
    def initialize(name = "怪物猎人世界", price = 200)
        @name = name
        @price = price
    end
end

class 下面有啥方法?

Phone.instance_methods(false)

这个方法,可以让我们知道该类下,有什么方法是我们自定义的。

对于上面写的 Phone 类,输出结果就会是:

call

就这么简单。

如果参数为 true 呢,则会显示所有的方法,包括自带的方法。

如何判断这个方法是否存在呢?

iphone = Phone.new
iphone.respond_to?("call")

respond_to? 这个方法可以判断该对象是否拥有某个方法,可以返回一个布尔值。

所以我们通常可以这么用:iPhone.respond_to?("call") && iPhone.call

(未完待续)文章来源地址https://www.toymoban.com/news/detail-807291.html

到了这里,关于Ruby 趣学笔记(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TypeScript教程(三)变量声明

    变量是一种使用方便的占位符,用于引用计算机内存地址,可以将变量看做存储数据的容器 命名规则: 1.变量名称可以包含数字和字母 2.除了下划线_和美元$符号外,不能包含其他特殊字符,包括空格 3.变量名不能以数字开头 以下四种方式声明变量: 1.声明变量的类型及初始

    2024年02月12日
    浏览(42)
  • 无涯教程-Lua - 变量声明

    变量的名称可以由字母,数字和下划线字符组成。它必须以字母或下划线开头,由于Lua区分大小写,因此大写和小写字母是不同的。 在Lua中,尽管无涯教程没有变量数据类型,但是根据变量的范围有三种类型。 全局变量(Global)     - 除非明确声明为局部变量,否则所有变量

    2024年02月14日
    浏览(46)
  • 如何在PHP中声明一个变量?

    在PHP中,你可以使用 $ 符号来声明一个变量。变量名是区分大小写的,可以包含字母、数字和下划线,但必须以字母或下划线开头。以下是一些声明变量的示例: 需要注意的是,PHP是动态类型语言,不需要在变量声明时指定类型。变量的类型会根据所赋的值而自动确定。

    2024年02月04日
    浏览(46)
  • TypeScript的变量声明的各种方式

    TypeScript是一种静态类型的JavaScript超集,它为JavaScript代码提供了类型检查和更好的代码组织结构。在TypeScript中,变量声明是非常重要的,因为它们定义了变量的类型和范围。本文将详细介绍TypeScript的变量声明,并通过代码案例分析来说明其用法。 变量声明 在TypeScript中,变

    2024年02月10日
    浏览(76)
  • 【Ruby学习笔记】24.Ruby JSON及RubyGems

    前言 本章介绍Ruby的JSON和RubyGems。 Ruby JSON 本章节我们将为大家介绍如何使用 Ruby 语言来编码和解码 JSON 对象。 环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块。在安装该模块前你需要先安装 Ruby gem,我们使用 Ruby gem 安装 JSON 模块。 但是,如果你使

    2023年04月12日
    浏览(30)
  • Rust变量、常量声明与基本数据类型

    Rust是一门系统级别的编程语言,注重安全性、性能和并发。在这篇博客中,我们将介绍Rust中的变量、常量声明以及基本数据类型,并通过示例说明每一种类型的用法。 在Rust中,使用 let 声明变量。变量默认是不可变的,要使其可变,需要使用 mut 。 常量使用

    2024年01月18日
    浏览(61)
  • c 语言关于未声明变量赋值机制

      1. 示例代码:   2. 运行结果:

    2024年02月10日
    浏览(43)
  • 【JavaScript】JavaScript 变量 ① ( JavaScript 变量概念 | 变量声明 | 变量类型 | 变量初始化 | ES6 简介 )

    JavaScript 变量 是用于 存储数据 的 容器 , 通过 变量名称 , 可以 获取 / 修改 变量 中的数据 ; 变量 的 本质 是 存放数据 的 一块内存空间 ; 在 JavaScript 中, 使用 var / let / const 来声明变量 , 每个变量都有一个 变量名 和 一个 变量值 ; JavaScript 变量声明 : var : 使用

    2024年03月15日
    浏览(52)
  • ECMAScript6和其常量变量的声明

    目录 1.介绍 2.babel--ES6代码转换为ES5的代码 1.安装转码工具 2.安装转换规则 3.指定转换规则 新建.babelrc 4.也可以将ES6转换为ES5之后的文件输入到另一个文件当中 5.将整个src目录下的es6文件转换成es5文件到dist目录 ​3.模块化 1-module1.js 2-module2.js ES6导出的是一个接口,接口存放的

    2024年02月15日
    浏览(39)
  • 【Rust】001-基础语法:变量声明及数据类型

    “一切能用 Rust 重写的项目都将或者正在用 Rust 重写” Rust 入门与实践:https://juejin.cn/book/7269676791348854839?utm_source=course_list 代码演示 执行结果 依赖 Cargo.toxml 代码 执行命令 根目录执行 整型标量类型 只要记得最低从 8 开始,到 128 结束(当然,正常情况下我们最多用到 64,

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包