Day 4 Ruby 变数与资料型别 Variable and Data Type

写在前面

因为发现昨天在讲基础运算子的时候很多地方需要先知道变数跟资料型别,所以今天赶快来补充一下。真的是越写会越发现程序语言的每个知识都是环环相扣的,缺一不可,但是学习的顺序又很难拿捏。可能就是全部一起看过去,当你在实作的过程中就会发现这一路上所学的会全部串在一起!

变数

变数就像姓名贴纸一样,可以让我们简单的叫出某个资料。就像是一个人会有很多特质,高矮、胖瘦、生理性别、肤色发色...等,但如果每次要叫一个人就要把她所有特质都叫出来才能"呼叫"那个人,感觉就有点累、有点没效率吧?所以我们出生的时候,有人会帮我们取名字,长大之後偶尔还会有绰号出现。这个取名的过程就像是变数宣告一样,把你这个人指定给这个名字,以後只要叫到这个名字就是在说你啦!!!!

通常 Ruby 里面的变数都是小写英文字或 _ 开头,不过你如果要用中文或 Emoji 来当变数名称也是可以的,只是会有点... 奇妙。 BUT!!! 在 Ruby 里面变数是不能用数字开头的。变数的命名是一门大学问,通常要注意可读性,要把读你的 Code 的人想像成对这个专案完全没有背景的人,如果他也能看懂的话就代表是个好懂的 Code。

还有个很重要的东西忘了提!那就是在 Ruby 里面英文大小写是不一样的唷!

> aBc = 123
=> 123
> aBc
=> 123
> abc
NameError (undefined local variable or method `abc' for main:Object)

昨天有说过我们在宣告变数的时候用的是一个等号,等号的左边就是那个"名字",等号的右边就是你想要连结的资料。
像是:a = 123 就是把 123 这串数字指定给 a 这个变数,所以你下次呼叫 a 的时候就会跑出 123 罗。

Ruby 里的变数可以简单地分成四种:

  1. 区域变数 Local Variable (变数前面不带前缀)
  2. 实体变数 Instance Variable (变数前面加 @)
  3. 类别变数 Class Variable (变数前面加 @@)
  4. 全域变数 Global Variable (变数前面加 $)

就我目前的观察,在写 Ruby on Rails APPs 刚开始最容易碰到的是前面两个,後面两个可能要等我功力比较高深之後才会慢慢碰到吧。

这四种变数最大的差异就是作用的范围,
区域变数(英文其实是"当地"变数?)顾名思义就是只能在你那个小区域里面作用,像是之後会提到的类别或方法的 block 里面,如果还没宣告就直接呼叫的话,会跳出NameError (undefined local variable or method 'l' for main:Object) 的命名错误。
实体变数则是可以存活在你新建了的一个类别实体里面,另外如果你在还没宣告实体变数的状况下呼叫的话,会回传 nil (空值,之後会提到)
(关於类别跟实体只能留待後面解释,所以类别变数在这边就先跳过)
全域变数就是照字面上说的一样在哪里都可以用啦!但是建议不要轻易使用全域变数,很容易就会造成污染或是让整个环境变得非常复杂。全域变数也是在还没宣告的状况下呼叫会回传 nil 的。

资料型别

Ruby 的资料型别可分为下面几种

  1. 数字 Number
    包括整数 Integer、浮点数 Float、小数 Decimal(浮点数跟小数的差别可以另外写一篇说明XD)
    总之就是自带一些运算功能的资料,可以跟我们想像的一样做加减乘除
    但是浮点数在计算上会有一些问题,不是那麽精准,至於为什麽会这样,要如何解决,就等之後一起说明罗,好奇的朋友们可以先在 irb 里面试试看 > 0.1 + 0.2 看会得出什麽结果。
  2. 字串 String
    " " 包起来的资料,所以 "123" 也是属於字串而不是数字喔!
  3. 布林值 Boolean
    truefalse

阵列、杂凑、符号会在之後更详细的说明,现在先来说说一些有关宣告的东西

  1. 阵列 Array
    [ ] 包起来的一串东西,具有顺序性,不同的项目要用逗号隔开,,里面可以是各种资料,甚至可以是另一个阵列
> a = []
> b = [123]
> c = [123, "123", "abc"]
> d = [123, 123, 123]
> e = [nil, 123, [1, 2], {abc: 123}, :abc, true]
> 以上都是可以的唷
  1. 杂凑 Hash
    { } 包起来的一串东西,里面会有 key 跟 value 的组合,key 会是符号或是字串, value 则是各种资料型别都可以,key 跟 value 会用 => 来隔开,但是 Ruby 现在的版本让我们可以比较直觉方便的宣告 Hash,所以可以直接用 : 来隔开,就会有一样的效果
> a = {:abc => 123}
> b = {abc: 123}
> c = {a: 1, b: 2}
> d = {"abc" => 123, "def" => [1, 2, 3], "g" => nil, "e" => true}
> e = {abc: 123, def: 123, g: nil, e: true}

其中要注意用符号当 key 跟用字串当 key 是代表不同意思的。另外在宣告时如果是用 {"abc": 123} 则 key 会直接从字串转换成符号。还有 Hash 里面的 key value 组合是没有顺序性的。

  1. 符号 Symbol
    这是一个跟字串有点像的东西,之後会特地拉一天来解释这个东西,因为真的有点难懂。
    现在先知道有 : 开头的就是符号,像是 :abc, :good 这种资料,Hash 的 Key 通常也会选择使用符号

  1. 空值 nil
    空值就是什麽都没有的意思啦!要注意的是如果你输入空字串、空阵列、空杂凑,他们都不会是没有喔,他们都还是存在喔(是不是很玄!!!!?)这个没有就是真的没有(到底在说什麽?)反正就是...nil 代表着一个不存在(很像还是没有懂)呃... 让我们继续看下去

另外值得一提的是在 ruby 里面,会被当作 false 的就只有 false 本身还有 nil,其他所有资料都会被当作 true(不管是空字串、空阵列、空杂凑都是真的啦!都是存在的啦!)(是不是觉得我疯了?)

> nil == ""    # false
> nil == []    # false
> nil == {}    # false

写在後面

开始真正进入 Ruby 之後就发现之前很像真的学了一些东西,然後真的是环环相扣环环相扣扣扣扣扣啊!!!!! 写到一半都会发现:啊,这个也要写一下,啊,那个很像不解释这边会变很奇怪,那就等我继续让文章们堆叠出来之後再来做整理了... 如果有哪里说错的欢迎留言给我跟我说,毕竟我也还是个孩子啊!


<<:  【LeetCode】bit operation

>>:  # Day 10 Cache and TLB Flushing Under Linux (二)

Day26 React-实作todoList(一)前置

来做个todoList来验收这近一个月的React学习成效吧! 在制作之前,我先用Html设计想要的...

DAY15-React to React

前言: 上一篇我们讲了如何建立你的第一个React网页,那今天阿森会介绍我们写网页会用到怎样的架构...

[DAY 23] Elo Rating

当想要比较两人的强弱时 通常比较过去结果很容易受到各因素干扰 如果可以直接量化两人的表现 就可以直接...

13 | WordPress 清单区块 List Block

如果你平常要处理大量文书工作,应该对我们这次介绍的「项目符号和编号」并不陌生,这又另称为清单区块 ...

Day 12- 提计画案初体验

开启Word档案後先是脑袋一片空白於是请教了同事有没有计画书的范本,看完之後灵感有如用涌泉般的冒出,...