Ruby设计-基础语法

news/2025/3/15 3:28:15/

一、脚本语言

​ 我似乎对于 Python 和 Ruby 强求太多了,我要让他们实现 C 的所有功能。他们确实可以实现所有的功能,但是他们的目的不是为了这个。

​ 我也可以用 shell 实现很多复杂的算法,但是我绝对不会用他去写图着色或者动态规划。但是我使用 python 和 Ruby 的时候却又这种倾向。我不会强求 C 为我列出目录中的所有文件,但是我却会强求 python,可叹啊。

​ 我之前似乎把语言看成了算法和架构的载体和实现,怪不得过得这么不幸福。


二、调用命令

​ 神奇用法,可以直接调用 ls 这样的指令。

print <<`EOC`                 # 执行命令ls -al
EOC

​ 这或许进一步说明了它就是个脚本。


三、外部传参

​ ruby 的脚本调用的时候是可以传参的,下面的脚本

puts ARGV.class
puts ARGV.first
puts ARGV.last
puts ARGV[1]

​ 如果在 zsh 中输入

ruby argv.rb 1 2 3 

​ 那么输出是

Array
1
3
2

​ 就是将后面的输入视为一个数组,原理比较显然。


四、输入输出

​ 输出比较简单的是 puts 类似于 C 语言中 puts(有种传言说 ruby 特意模仿了一些 C)。如果想要格式化输出,也是可以的,见下

# format output
puts "Hello %s" %["cnx"]
puts "Hello %c" %[65]
puts "Hello %x" %[2147483648]months = "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"
puts months

​ 输入没有细致探讨过,似乎这个是可以的

# input
a = gets.chomp 
puts a 

五、文件操作

​ 跟 C 依然很像,太像了

filename = ARGV.first
script = $0puts "Opening the file..."
target = File.open(filename, 'w')puts "Truncating the file.  Goodbye!"
target.truncate(target.size)puts "Now I'm going to ask you for three lines."print "line 1: "; line1 = STDIN.gets.chomp()
print "line 2: "; line2 = STDIN.gets.chomp()
print "line 3: "; line3 = STDIN.gets.chomp()puts "I'm going to write these to the file."target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")puts "And finally, we close it."
target.close()src = File.open(filename, "r")
indata = src.read()puts "The input file is #{indata.length} bytes long"
puts "The input data is "
puts indata

六、数据结构

6.1 Hash

​ HashMap 的意思,感觉比 Java 的还好用,语法有点像 C++

grades = {'CNX' => 100, 'QS' => 0, 'LSZ' => 120}puts grades['CNX']
grades['QS'] = 20grades.each do |name, grade|puts "#{name} : #{grade}"
end

6.2 语句块

​ 这是一个很有意思的东西,就是我们可以定义一个被叫做““的结构,有两种写法

do |x|x *= xputs x
end{|x| x *= x; puts x}

然后这个块结构就可以作为函数参数传参了(感觉有点函数式和匿名函数的意思了),比如说这个

grades.each do |name, grade|puts "#{name} : #{grade}"
end

​ 其实是作为 hashgrades 对象调用 each 方法,这个方法有一个参数,就是这个块

grades.each (do |name, grade|puts "#{name} : #{grade}"
end)

6.3 整数

​ 取整的时候是向下取整,而不是向零取整,这点与 C 或者 Java 不同,但是与 Python 相同。

6.4 Array

​ 声明形式是这样的

a = [1, 2, 3, 4]

​ 有的时候还可以骚一点

a = Array.new(4) {|i| i + 1}

​ 对于数组的索引访问,跟 python 一样强大,支持负数。

puts a[0] 	# 1
puts a[-1] 	# 4

​ 和 python 一样,支持切片

b = Array.new(5) {|i| (i + 'A'.ord).chr}
printf "%s\n", b			# "A", "B", "C", "D", "E"]printf "%s\n", b[1, 3] 		# ["B", "C", "D"]
printf "%s\n", b[2..4]		# ["C", "D", "E"]

​ 同时有了一堆好用的操作符

c = [1, 2, 3]
puts c.to_s			# [1, 2, 3]
c += [4, 5, 1]
puts c.to_s			# [1, 2, 3, 4, 5, 1]
c -= [1, 4, 5]
puts c.to_s			# [2, 3]
c *= 3
puts c.to_s			# [2, 3, 2, 3, 2, 3]
c << 5
puts c.to_s			# [2, 3, 2, 3, 2, 3, 5]

6.5 Range

​ 似乎 python 中也有这种结构,但是这个似乎被当成了独立的一种内置的数据结构

(1..5)        #==> 1, 2, 3, 4, 5
(1...5)       #==> 1, 2, 3, 4
('a'..'d')    #==> 'a', 'b', 'c', 'd'

6.6 Symbol

​ 符号,就是编译原理里符号表里的那个符号,Ruby 的神奇就在于可以直接在程序中定义这个符号,方法是加个标识符

a = :s
puts ab = :"s"
puts bputs b.equal?a		# true

七、注释

单行注释

# There is a single line comment

多行注释

=beginThere are comments.There are comments.There are comments.There are comments.
=end

八、标识符里的标点符号

$var	# 全局变量
@var	# 实例变量,就是面向对象中属性的意思
@@var	# 类变量,就是 Java 中静态属性的意思
empty? 	# 'empty?' 是方法的名字,如果以 ? 结尾,说明这个方法返回值是布尔值
sort!	# 'sort!' 是方法的名字,如果以 ! 结尾,说明这个方法会改变对象本身,而不是返回一个被改变的 clone

九、迭代器

​ 这里的迭代器其实不是一个 Java 或者 cpp 中出现的跟指针一样可以自增的东西,而是一个方法,这个方法接受一个代码块作为参数。这里利用了关键词 yield 。示例如下,我模拟了一个数组,然后实现了它的迭代器方法 each

class MyArraydef initialize(a)@a = a enddef each for i in 0...@a.sizeyield @a[i]endend
enda = [1, 2, 3]
my_a = MyArray.new(a)
my_a.each do |e|puts e
end

​ 可以看到,对于 each 方法,在实现中进行了遍历,但是并没有说明遍历要干什么,只是有一个

yield @a[i]

​ 对于这个情况, yield 会调用我们传给他的代码块,也就是

do |e| puts e end

​ 然后给形参 e 赋值 @a[i] ,然后对于数组中的每个元素有一个 puts e 的操作,相当于这个

for i in 0...@a.sizeputs @a[i]
end

​ 可以看到代码块的这种方式,大大拓展了原有函数的功能。

​ 我们可以再看一个例子,这个例子不是类中的例子,而就是普通的一个方法,用于输出一个等差数列。

def sequence(n, step, c)(0..n).each do |i|yield i * step + cend
endsequence(5, 3, 2) {|x| puts x}

http://www.ppmy.cn/news/39408.html

相关文章

TypeScript01-基础知识

基础类型 boolean 类型 let isDone: boolean false; // ES5&#xff1a;var isDone false;number 类型 let count: number 10; // ES5&#xff1a;var count 10;string 类型 let name: string "semliker"; // ES5&#xff1a;var name semlinker;Symbol 类…

Esp8266+阿里云+STM32点灯(二)

目录 1、简介 2、阿里云配置 2.1添加设备 2.2 发布设备 3、根据参数使用AT指令配置ESP使设备上线 1、简介 完成ESP8266固件烧录后&#xff0c;进行ESP8266模块连接阿里云。 2、阿里云配置 2.1添加设备 点击主页右上角控制台&#xff0c;如下图所示&#xff1a; 接着搜索物…

4.5--计算机网络之基础篇--2.网址到网页解析--(复习+深入)---好好沉淀,加油呀

1.浏览器做的第一步工作是解析 URL 对 URL 进行解析&#xff0c;从而生成发送给 Web 服务器的请求信息 URL? URL 实际上是请求服务器里的文件资源 当没有路径名时&#xff0c;就代表访问根目录下事先设置的默认文件&#xff0c;也就是 /index.html 或者 /default.html 这些文件…

Vue3电商项目实战-结算支付 3【05-结算-收货地址-添加、06-结算-收货地址-修改、07-结算-提交订单】

文章目录05-结算-收货地址-添加06-结算-收货地址-修改07-结算-提交订单05-结算-收货地址-添加 目的&#xff1a;实现收货地址的添加。 大致步骤&#xff1a; 独立组件&#xff0c;准备一个对话框完成表单布局完成确认添加操作 落的代码&#xff1a; 1.独立组件&#xff0c;准…

ChatGPT中文免登陆-ChatGPT中文版上线

ChatGPT不支持地区 ChatGPT 是一个开源平台&#xff0c;可在全球范围内使用&#xff0c;不应该存在地区限制。然而&#xff0c;由于某些原因&#xff0c;可能有地区对 ChatGPT 的访问有限制或屏蔽的情况。 如果您发现自己无法访问 ChatGPT&#xff0c;可以尝试以下解决方法&a…

ChatGPT的失败,是认知的失败,也是理解的失败

当下正在发生的事情&#xff0c;我们早已经历过&#xff0c;而且不止一次。当下以及可见的未来&#xff0c;ChatGPT除了“比人类更有效地”完成报告和写作等“智能”任务外&#xff0c;更多的恐怕是更多的“想象”了&#xff01;现在不是一些未知的东西正在做我们不知道的事情&…

Linux常用指令【文件目录操作】

linux 文件目录操作指令pwd 指令ls 指令cd 指令mkdir 指令rmdir 指令touch 指令cp 指令rm 指令mv 指令cat 指令more 指令less 指令> 和 >> 指令echo 指令head 指令tail 指令ln 指令history 指令pwd 指令 基本语法 pwd (显示当前工作目录的绝对路径) ls 指令 基本语法…

SQL——数据操作DML

对数据表中的数据的添加insert、删除delete、修改update操作。 目录 1 插入数据 2 删除数据 3 修改数据 1 插入数据 # 语法 insert into <tableName>(columnName,columnName....) values(value1,value2....);# 示例 ## 向数据表中指定的列添加数据&#xff08;不允许…