为了读一本用 Ruby 描述的书,而又不想专门学习 Ruby 的语法,故有了这部分内容整理。
Ruby | Python | 说明 |
---|---|---|
# |
# |
单行注释 |
=begin … =end |
""" … """ |
多行注释 |
puts |
print |
输出到标准输出 |
gets |
input |
从标准输入获取字符串 |
a = 1 |
a = 1 |
变量赋值 |
a.class |
type(a) |
获取变量的类型 |
"hello" + "world" |
"hello" + "world" |
字符串拼接 |
"hello" * 3 |
"hello" * 3 |
字符串重复 |
"hello"[0] |
"hello"[0] |
字符串索引 |
"hello"[0..2] |
"hello"[0:3] |
字符串切片 |
"hello".length |
len("hello") |
字符串长度 |
"hello".reverse |
"hello"[::-1] |
字符串反转 |
"hello".upcase |
"hello".upper() |
字符串转大写 |
"HELLO".downcase |
"HELLO".lower() |
字符串转小写 |
"hello".capitalize |
"hello".capitalize() |
字符串首字母大写 |
"hello".include?("ll") |
"ll" in "hello" |
判断字符串是否包含子串 |
[1, 2, 3] |
[1, 2, 3] |
列表(数组)字面量 |
[1, 2, 3].length |
len([1, 2, 3]) |
列表(数组)长度 |
[1, 2, 3][0] |
[1, 2, 3][0] |
列表(数组)索引 |
[1, 2, 3][0..1] |
[1, 2, 3][0:2] |
列表(数组)切片 |
[1, 2, 3].push(4) or [1, 2, 3] << 4 |
[1, 2, 3].append(4) or [1, 2, 3] + [4] |
列表(数组)添加元素 |
[1 ,2 ,3][0] and [1 ,2 ,3][0]=nil or [1 ,2 ,3].slice!(0) or [1 ,2 ,3].unshift(4) or [4]+[1 ,2 ,3] .pop() or [4]+[1 ,2 ,3].delete_at(-1) or [4]+[1 ,2 ,3][-1] and [4]+[1 ,2 ,3][-1]=nil .pop() or [4]+[1 ,2 ,3].slice!(-1) .pop() or [4]+[1 ,2 ,3].shift() .pop() or [4]+[1 ,2 ,3].delete_at(0) .pop() or [4]+[1 ,2 ,3][0] and [4]+[1 ,2 ,3][0]=nil .pop()` |
[1, 2, 3].pop() or del [1, 2, 3][-1] |
列表(数组)删除最后一个元素 |
[1, 2, 3].shift() or [1, 2, 3].delete_at(0) or [1, 2, 3][0] and [1, 2, 3][0]=nil or [1, 2, 3].slice!(0) |
[1, 2, 3].pop(0) or del [1, 2, 3][0] |
列表(数组)删除第一个元素 |
[1, 2, 3].unshift(4) or [4]+[1, 2, 3] |
[1, 2, 3].insert(0, 4) or [4] + [1, 2, 3] |
列表(数组)在开头插入元素 |
[1, 2, 3].insert(1, 4) |
[1, 2, 3].insert(1, 4) |
列表(数组)在指定位置插入元素 |
a = [1, 2]; b = a; b[0] = -1; a |
a = [1, 2]; b = a; b[0] = -1; a |
列表(数组)赋值是引用传递 |
a = [1, 2]; b = a.dup; b[0] = -1; a |
a = [1, 2]; b = a.copy(); b[0] = -1; a |
列表(数组)赋值是值传递 |
a = [5]; b = a * -5; b |
a = [5]; b = a * -5; b |
列表(数组)乘以负数为空列表(数组) |
{a: "apple", b: "banana"} or {:a => "apple", :b => "banana"} |
{"a": "apple", "b": "banana"} |
字典(哈希)字面量 |
{a: "apple", b: "banana"}[:a] or {:a => "apple", :b => "banana"}[:a] |
{"a": "apple", "b": "banana"}["a"] |
字典(哈希)索引 |
{a: "apple", b: "banana"}.keys or {:a => "apple", :b => "banana"}.keys |
{"a": "apple", "b": "banana"}.keys() |
字典(哈希)获取所有的键 |
{a: "apple", b: "banana"}.values or {:a => "apple", :b => "banana"}.values |
{"a": "apple", "b": "banana"}.values() |
字典(哈希)获取所有的值 |
{a: "apple", b: "banana"}.length or {:a => "apple", :b => "banana"}.length |
len({"a": "apple", "b": "banana"}) |
字典(哈希)的长度 |
{a: "apple", b: "banana"}.merge({c: "cherry"}) or {:a => "apple", :b => "banana"}.merge({:c => "cherry"}) |
{"a": "apple", "b": "banana"}.update({"c": "cherry"}) |
字典(哈希)合并 |
{a: "apple", b: "banana"}.delete(:a) or {:a => "apple", :b => "banana"}.delete(:a) |
del {"a": "apple", "b": "banana"}["a"] |
字典(哈希)删除键值对 |
true |
True |
布尔值真 |
false |
False |
布尔值假 |
nil |
None |
空值 |
!true or not true |
not True |
布尔值取反 |
true and false or true && false |
True and False |
布尔值与运算 |
true or false or `true |
false` | |
(1..10) or (1...11) |
range(1, 11) |
范围(区间)字面量 |
(1..10).to_a or (1...11).to_a |
list(range(1, 11)) |
范围(区间)转换为列表(数组) |
(1..10).include?(5) or (1...11).include?(5) |
5 in range(1, 11) |
判断范围(区间)是否包含某个元素 |
(1..10).each { |x| puts x } or (1...11).each { |x| puts x } |
for x in range(1, 11): print(x) |
遍历范围(区间)中的元素 |
(1..10).map { |x| x * 2 } or (1...11).map { |x| x * 2 } |
[x * 2 for x in range(1, 11)] |
对范围(区间)中的元素进行映射操作 |
(1..10).select { |x| x.even? } or (1...11).select { |x| x.even? } |
[x for x in range(1, 11) if x % 2 == 0] |
对范围(区间)中的元素进行筛选操作 |
if x > 0 then puts "positive" elsif x < 0 then puts "negative" else puts "zero" end |
if x > 0: print("positive") elif x < 0: print("negative") else: print("zero") |
条件语句 |
case x when 1 then puts "one" when 2 then puts "two" else puts "other" end |
if x == 1: print("one") elif x == 2: print("two") else: print("other") |
分支语句 |
while x > 0 do puts x; x -= 1 end |
while x > 0: print(x); x -= 1 |
循环语句 |
for i in (1..10) do puts i end or (1..10).each do |i| puts i end |
for i in range(1, 11): print(i) |
遍历语句 |
break |
break |
跳出循环 |
next |
continue |
跳过本次循环 |
return x or x |
return x |
返回值 |
def add(x, y) return x + y end or def add(x, y) x + y end |
def add(x, y): return x + y |
定义函数 |
add(1, 2) or add 1, 2 |
add(1, 2) |
调用函数 |
def add(x, y = 0) return x + y end or def add(x, y = 0) x + y end |
def add(x, y = 0): return x + y |
定义带有默认参数的函数 |
add(1) or add(1, 2) or add 1 or add 1, 2 |
add(1) or add(1, 2) |
调用带有默认参数的函数 |
def add(*args) return args.sum end or def add(*args) args.sum end |
def add(*args): return sum(args) |
定义带有可变参数的函数 |
add(1, 2, 3) or add 1, 2, 3 |
add(1, 2, 3) |
调用带有可变参数的函数 |
def add(x:, y:) return x + y end or def add(x:, y:) x + y end |
def add(**kwargs): return kwargs["x"] + kwargs["y"] |
定义带有关键字参数的函数 |
add(x: 1, y: 2) or add x: 1, y: 2 |
add(x = 1, y = 2) |
调用带有关键字参数的函数 |
lambda { |x| x * 2 } or ->(x) { x * 2 } |
lambda x: x * 2 |
匿名函数(lambda)字面量 |
(lambda { |x| x * 2 }).call(5) or (->(x) { x * 2 }).call(5) |
(lambda x: x * 2)(5) |
调用匿名函数(lambda) |
[1, 2, 3].map(&lambda { |x| x * 2 }) or [1, 2, 3].map(&->(x) { x * 2 }) |
list(map(lambda x: x * 2, [1, 2, 3])) |
使用匿名函数(lambda)作为参数 |
[1, 2, 3].select(&lambda { |x| x.even? }) or [1, 2, 3].select(&->(x) { x.even? }) |
list(filter(lambda x: x % 2 == 0, [1, 2, 3])) |
使用匿名函数(lambda)作为参数 |
class Person attr_accessor :name def initialize(name) @name = name end def say_hello puts "Hello, #{@name}!" end end |
class Person: def __init__(self, name): self.name = name def say_hello(self): print(f"Hello, {self.name}!") |
定义类 |
p = Person.new("Alice") |
p = Person("Alice") |
创建类的实例 |
p.name |
p.name |
访问类的属性 |
p.name = "Bob" |
p.name = "Bob" |
修改类的属性 |
p.say_hello |
p.say_hello() |
调用类的方法 |
class Student < Person attr_accessor :grade def initialize(name, grade) super(name) @grade = grade end def say_hello puts "Hello, #{@name}! I'm in grade #{@grade}." end end |
class Student(Person): def __init__(self, name, grade): super().__init__(name) self.grade = grade def say_hello(self): print(f"Hello, {self.name}! I'm in grade {self.grade}.") |
定义子类 |
s = Student.new("Charlie", 5) |
s = Student("Charlie", 5) |
创建子类的实例 |
s.name |
s.name |
访问子类的属性 |
s.grade |
s.grade |
访问子类的属性 |
s.say_hello |
s.say_hello() |
调用子类的方法 |
module Math def self.square(x) x * x end end |
def square(x): return x * x |
定义模块 |
Math.square(2) |
square(2) |
调用模块的方法 |
require "math" |
import math |
导入模块 |
Math.sqrt(2) |
math.sqrt(2) |
调用模块的方法 |
require "math" or include Math |
from math import * |
导入模块的所有方法 |
sqrt(2) |
sqrt(2) |
调用模块的方法 |
a = [1, 2, 3] |
a = [1, 2, 3] |
定义数组(列表) |
a[0] |
a[0] |
访问数组(列表)的元素 |
a[0] = 4 |
a[0] = 4 |
修改数组(列表)的元素 |
a.length |
len(a) |
获取数组(列表)的长度 |
a << 5 or a.push(5) |
a.append(5) |
向数组(列表)的末尾添加元素 |
a.pop |
a.pop() |
从数组(列表)的末尾删除元素 |
a.unshift(0) |
a.insert(0, 0) |
向数组(列表)的开头添加元素 |
a.shift |
a.pop(0) |
从数组(列表)的开头删除元素 |
a + [6, 7] |
a + [6, 7] |
连接两个数组(列表) |
[1, 2, 3] * 2 or [1, 2, 3].cycle(2).to_a |
[1, 2, 3] * 2 or [x for x in [1, 2, 3] for _ in range(2)] |
复制数组(列表)的元素 |