Ruby基本介绍(二) && Palindrome-number解法

保持好心情,写code前,先听首K-pop!


此篇文章会提到的事

  • 上篇文章衍生题回答。
  • 内建类别补充。
  • 变数补充。
  • 流程控制(Folw Controller)与回圈(Loop)事前准备。
  • Palindrome-number解题分享。

还是要重申,这是菜鸟我目前的回答,学习跟查资料後一定会有更好的答案。

变数与常数的差别?

变数:在Ruby中,变数是非大写开头的英文字母组合,可加数字但第一个字要英文,不可加符号。
常数:在Ruby中,常数是开头大写英文字母组合,可加数字但第一个字要英文。类别及模组等都须以常数来命名,可与变数一样直接宣告资料为实体,但在Ruby中与其他语言较明显差异,常数可以更改资料(会有警告)。
菜鸟解答 : 类别及模组类别必须用常数命名,常数第一个英文字母必须用大写英文,因为Ruby的特性,通常将不会去更动的资料用常数去命名。

符号与字串的差别?

初期常会看到的符号是指

:a , :name

并非指加减乘除那些符号。
菜鸟解答 :真想回答没有差别,在初期学习过程中能明显知道的差异为,因符号固定记忆体储存位置所以不可更动,并且因记忆体位置固定,所以使用符号,处理速度较快。
补充:物件後加上.object_id可查询物件参照位置(object reference)。
https://ithelp.ithome.com.tw/upload/images/20210806/20135887JKP5AtpLlS.png
有兴趣者也可用阵列,数字其他资料来查询。


内建类别补充

阵列(Array)

重申:内建类别很多程序语言都是相同有的,但是或多或少各程序语言都有特殊的"语法"来处理。
基本介绍,用[]来包住的资料通常都是阵列,例如

[1, 3, 5, 6, 8]
["我", "爱", "听", "音乐"]

,当然也有许许多多特性以及黑魔法需要学习,例如

#夥伴可以试着自行在Interactive Ruby Shell环境中操作,就是irb那个。
[1, 2, 3] + [7, 8, 9]
[1, 2, 3, 4] - [2, 4, 5]
["我", "爱", "听", "音乐"].join

阵列像个药盒,每一格放着可能相同或不同的资料。(空格内可以是nil)
但阵列有个很基础且大多语言相同的特性,阵列第一个资料我们在呼叫时,他所占的位置不是1是0,最後一格资料所占位置是阵列格数n-1,例如
https://ithelp.ithome.com.tw/upload/images/20210806/20135887wet3OyAfCG.png
这项特性,初期就常会遇到喔!

杂凑(Hash)

Ruby称杂凑,也有语言称"字典",与阵列最好辨别的差别是用{}包起,以及每个位置一定有"KEY",位置内当然也可以有nil,但是因为格子内可以放复数资料,所以通常不会用药盒那样想Hash,可以想成车站内那种置物箱吧。

{:a => 123, :b => 456, "c" => 789}
{:a => 123, :b => "来听K-pop!", :c => nil}
{:a => [1, 3, 5], :b => {"as" => 2 , :ccc => "我不要"} , :c => 2021}

一样有许多语法,让我们可以操作

{:b => 1, :a => 2}.has_key?(:a)
{:b => 1, :a => 2}.delete(:a)

从阵列到杂凑开始,在Ruby及Rails运用上常常就不会是简单的加减乘除。其实在网路资料传输上,电脑之间传送的资料都是杂凑型态,例如line内的对话,一张早安图,不会是一个"早安.jpg"就可以,从长辈传到我们手上,加上及处理复杂的资料型态,就是程序语言的功能之一。

加码补充:

  new_hash = Hash.new
  #可以用
  new_hash = {}
  #取代
  
  new_arr = Array.new
  new_arr = []
  也是一样

变数补充

很多前辈可能会这样说,在Ruby中,变数宣告不用像JS需要var, let来协助宣告,其实开始有接触较复杂的编码後,可能就不会这样觉得了。是因为Ruby的生父在创造这语言时,加入了太多的"方便",所以在使用上我们常常直接宣告即可。
(js也是可以直接宣告环境变数呀,只要我敢.......但是同事可能会杀了我??)

前对提到,变数用小写英文字母开头为命名,例如

x = 123
# x 就是变数, 123就是资料, 变数指向一个资料後, 成为了一个实体, 这个实体开始有许多资料本身可以用的方法可以使用。

例如
https://ithelp.ithome.com.tw/upload/images/20210806/20135887r8gSV5twQ1.png

变数在Ruby的世界中,还有分一些特别的身份,这部分由分享文章来补充
是的,再次搬出为你自己学Ruby on Rails

建议一定要好好认识实体变数,在进入rails後会发现,实体变数就像你在rails世界中的情人,越了解,感情生活越顺遂....


流程控制(Folw Controller)与回圈(Loop)事前准备。

我用比喻的方式来说明,我今天得到一个资料,这个资料是一个数字,我就要将这个资料的数字+2後的结果算出来。这便是流程。

复杂一点的流程,我今天得到一个资料,我先要先判断这资料是不是一个数字,不是的话告诉传资料给我的人,是的话如上面一样运算。

再复杂一点,是数字後,我还要判断是不是大於100,我再计算。工程师要学习就是将这些复杂的需求变成编码告诉电脑处理,并且学习将这些编码简单化且好阅读。
将编码的运算速度加快,那是以後的事。

所以定义一个方法,来将资料做处理,就是一整个小流程控制。
如下
https://ithelp.ithome.com.tw/upload/images/20210806/20135887PlUHYSsIWZ.png

而我们进入流程控制後,可能需要一直重复做某些事,直到我们设定的条件为止,让电脑重复做一件事这个行为就叫回圈。
如果没有设定好条件,则可能会进入无限环圈。(可以想想要无限回圈做啥?)

下篇文章我们用常用的判断语法及回圈语法来正式介绍。


Palindrome-number解题分享。

题目连结:https://leetcode.com/problems/palindrome-number/
题目解释,判定数字反转回数字後,是否还是相同?
例子: 121(true), -121(false), 10(false), -101(false)
整理後如下 (从这边开始,我们也将可阅读性加入解题吧。先从变数命名有意义开始)

def is_palindrome(num)
  #流程编写区
end

puts is_palindrome(121)
puts is_palindrome(-121)
puts is_palindrome(10)
puts is_palindrome(-101)

上一题我们提到数字反转要用

integer.to_s.reverse.to_i

其实多查询就会发现一个语法是digits,这题我们就用digits来处理吧。

一样解析一下问题後,将我们需要的流程及特性先用中文整理出来。

def is_palindrome(num)
  #负数都是false
  #所以大於等於0时才需要去需做反转
  #反转後判断是否相同
end

接着先用最罗唆的写法写出来。

def is_palindrome(num)
  #负数都是false
  #所以大於等於0时才需要去需做反转
  if num >= 0 
    resverse_num = num.digits.join.to_i
  else num < 0 #如果判断点只有两个,else後面可以不打出
    return false
  end
  #反转後判断是否相同
  if resverse_num == num.digits.join.to_i
    true
  else resverse_num != num.digits.join.to_i
    false
  end
end

接着我们利用一些特性来整理这段控制流程。如果if判断条件像这种不是a就是b的状况时,我们可以直接用一项判断就可以完成编码,else後面可以省略,并且==这符号等於判断,如果是单纯要true或是false可以省略。所以

def is_palindrome(num)
  if num >= 0
    resverse_num = num.digits.join.to_i
  else
    return false
  end
  resverse_num == num.digits.join.to_i
end

再来,观察可以发现,我们做判断时因为去除了负数,而正整数在反转时,处於文字状态时就可以判定,所以不需要多一个变数来处理。因此

def is_palindrome(num)
  if num >= 0
    num.to_s = num.digits.join
  else
    return false
  end
  num.to_s == num.digits.join
end

我们再整理答案一下,何时会出现true?
在正整数时,且正整数反转比对後还相同时,所以其实整题只剩两个判断,而判断式可以用&&来加在一起。
所以

def is_palindrome(num)
  if num >= 0 && num.to_s == num.digits.join
    true
  else
    false
  end
end

最後也演变成其实不是a就是b的判断,所以

def is_palindrome(num)
  num >= 0 && num.to_s == num.digits.join
end

结束了这一题!


本篇衍生题

Ruby中,p与puts, &&与||, =与==分别有何不同?

Ruby是强型别还是弱型别?

什麽是K-pop!?


<<:  vue定义全域性变数

>>:  风险评估(Risk Evaluation)

Day2 在繁忙的时间上,到底该如何规划时间学习呢?

大家好,我是乌木白,之前在自我介绍时!有和大家说过我目前是一个学生,平常也是需要打工,所以在一天之...

[Day9] 注册API – admin

哈罗罗~~ 今天我们要来说明admin.py的部分啦~~ ,前面创建app时有稍微介绍一下,不知道夥...

git - 1 ( 环境安装、基础操作、工作目录 add + commit )

1. 安装环境 (1)右边下载 https://git-scm.com/ (2)下载安装完成 Win...

风险暴露(risk exposure)

-ISO 31000 该问题的核心概念是如何定性或定量地分析风险,以确定风险敞口,以货币价值,得分...

第56天~

这个得上一篇:https://ithelp.ithome.com.tw/articles/10261...