(整理)Ruby的基础知识
xzyxuanyuan0我的:收件箱资源博客空间设置|帮助|退出
- 首页
- 业界
- 移动
- 云计算
- 研发
- 论坛
- 博客
- 下载
更多
千月星跡
アイをも求めて彷徨っている孤独なヒーロー
- 目录视图
- 摘要视图
- 订阅
探究云计算数据中心节能增效之道 专访邓凡平:Android开发路上的快速学习之道 CSDN博客第二期最佳移动开发博主评选
Ruby 是面向 对 象的 编 程 语 言,她追求的是 “ 简 便快捷的面向 对 象 编 程 ” 。 Ruby 是解 释 型 语 言,因此不需 编译 即可快捷地 编 程。同 时 Ruby 具有 类 似 Perl 的 强 大的文本 处 理功能,她可并不只是个玩具,您可以用她来 进 行 实 用的 编 程。此外,您 还 可以很方便地使用 C 语 言来 扩 展 Ruby 的功能,因此可以把她当作各 种库 的前端来使用。
Ruby 是解 释 型 语 言,其程序无需 编译 即可 轻 松 执 行。
2 变 量无 类 型
Ruby 的 变 量没有 类 型,因此不必 为 静 态 的 类 型匹配而 烦恼 。相 应 地, 错误检查 功能也 变 弱了。
3 不需要 变 量声明
所有 变 量均无需声明即可立即使用。另外,从 变 量名即可判断 出是何 种变 量(局部 变 量,全局 变 量, 实 例 变 量)。
语 法比 较简单 , 类 似 Algol 系 语 法。
5 不需要内存管理
具有垃圾回收( Garbage Collect , GC )功能,能自 动 回收不再使用的 对 象。
6 一切都是 对 象
Ruby 从一 开 始就被 设计 成 纯 粹的面向 对 象 语 言,因此以整数等基本数据 类 型 为 首的所有 东 西都是 对 象,它 们 都有 发 送信息的 统 一接口。
类 , 继 承,方法
Ruby 当然具有面向 对 象 语 言的基本功能。
7 特殊方法
可向某 对 象添加方法。例如,可以把 GUI 按 钮 被按下 时 的 动 作作 为 方法 记 述下来, 还 可以用它来 进 行原型 库 ( prototypebase )的面向 对 象 编 程(有人 这么 干吧)。
用模 块进 行混合插入( Mixin )
Ruby 故意舍弃了多重 继 承,但 拥 有混合插入功能。使用模 块 来超越 类 的界限来共享数据和方法等。
8 迭代器
该 功能可以将循 环 抽象化。
9 闭 包
可以将某 过 程片段 对 象化。 对 象化后的 该过 程片段就称作 闭 包。
10 功能 强 大的字符串操作/正 则 表达式
以 Perl 为样 板 创 造出了功能 强 大的字符串操作和正 则 表达式 检 索功能。
11 拥 有超 长 整数
添加超 长 整数功能后,可以 计 算非常大的整数。例如 计 算 400 的 阶 乘也 轻 而易 举 。
12 具有 错误处 理功能
错误处 理功能可以使您 编 写代 码处 理出 错 情况。
13 可以直接 访问 OS
Ruby 可以使用( UNIX 的) 绝 大部分的系 统调 用。 单 独使用 Ruby 也可以 进 行系 统编 程。
14 动态 加 载
若 OS 支持的 话 ,可以在运行 时读 入 对 象文件。
但 Ruby 也有下列缺点。
15Ruby On Rails , 优 点是不像 Struts 那 样 需要大量的配置文件,一切都采取默 认 的配置,包括 访问 路径, uri 等,而 这 也是它的缺点,不能灵活的配置 。
Array .new
|
» |
[]
|
Array .new(2)
|
» |
[nil, nil]
|
Array .new(5, "A")
|
» |
["A", "A", "A", "A", "A"]
|
Array .new(2, Hash.new)
|
» |
[{}, {}]
|
h = {1 => 2, "2" => "4"}
{1=>2, "2"=>"4"}
h[1]
2
h["2"]
"4"
h[5]
nil
h[5] = 10 # appending value
10
h
{5=>10, 1=>2, "2"=>"4"}
h.delete 1 # deleting value
2
h[1]
nil
h
a
b
c
c=0
for i in 0..4
print i
if i == 2 and c == 0
c = 1
print "/n"
retry
end
end; print "/n"
012
01234
def repeat(num)
while num > 0
yield
num -= 1
end
end
repeat(3) { print "foo/n" }
foo
foo
foo
class Dog
def speak
print "Bow Wow/n"
end
end
class Bird
def preen
print "I am cleaning my feathers."
end
def fly
print "I am flying."
end
end
class Penguin<Bird
def fly
fail "Sorry. I'd rather swim."
end
end
class Human
| def identify
| print "I'm a person./n"
| end
| def train_toll(age)
| if age < 12
| print "Reduced fare./n";
| else
| print "Normal fare./n";
| end
| end
| end
nil
ruby> Human.new.identify
I'm a person.
nil
ruby> class Student1<Human
| def identify
| print "I'm a student./n"
| end
| end
nil
ruby> Student1.new.identify
I'm a student.
class Student2<Human
| def identify
| super
| print "I'm a student too./n"
| end
| end
nil
ruby> Student2.new.identify
I'm a human.
I'm a student too.
class Dishonest<Human
| def train_toll(age)
| super(11) # we want a cheap fare.
| end
| end
nil
ruby> Dishonest.new.train_toll(25)
Reduced fare.
nil
ruby> class Honest<Human
| def train_toll(age)
| super(age) # pass the argument we were given
| end
| end
nil
ruby> Honest.new.train_toll(25)
Normal fare.
def square(n)
| n * n
| end
nil
ruby> square(5)
class Foo
| def fourth_power_of(x)
| square(x) * square(x)
| end
| end
nil
ruby> Foo.new.fourth_power_of 10
"fish".square(5)
class Test
| def times_two(a)
| print a," times two is ",engine(a),"/n"
| end
| def engine(b)
| b*2
| end
| private:engine # this hides engine from users
| end
Test
ruby> test = Test.new
#<Test:0x4017181c>
ruby> test.engine(6)
ERR: (eval):1: private method `engine' called for #<Test:0x4017181c>
ruby> test.times_two(6)
6 times two is 12.
class SingletonTest
| def size
| print "25/n"
| end
| end
nil
ruby> test1 = SingletonTest.new
#<SingletonTest:0xbc468>
ruby> test2 = SingletonTest.new
#<SingletonTest:0xbae20>
ruby> def test2.size
| print "10/n"
| end
nil
ruby> test1.size
25
nil
ruby> test2.size
10
Math.sqrt(2)
1.41421
ruby> Math::PI
include Math
Object
ruby> sqrt(2)
1.41421
ruby> PI
例子是闹钟:你可以想像闹钟属于 钟类同是属于 带蜂音器的事物类.
Ruby并未特意实现真正的多重继承,但 糅和技术是一很好的替代.记得模块无法实体化或子类化;但如果我们在类定义里 include一个方法,
它的方法便实际上已加入,或"糅合"进这个类.
糅合可以视为一种寻求一切我们希望得到的特定属性的方法.举个例子,如果一个类有个 each 方法,把标准库里的 Enumerable模块糅合进来就自然地赋予我们 sort 和 find 两个方法.
一个新的 过程对象 可以通 过 proc 创 建 :
ruby> quux = proc { | print "QUUXQUUXQUUX!!!/n" | } #<Proc:0x4017357c> |
现 在 quux 指向一个 对 象 , 像其它 对 象一 样 , 它也有可以 调 用的行 为 . 特 别 的 , 我 们 可以用 call 方法 执 行它 :
ruby> quux.call QUUXQUUXQUUX!!! nil |
那 么 quux 可以用做一个方法的参数 吗 ? 当然 .
ruby> def run( p ) | print "About to call a procedure.../n" | p.call | print "There: finished./n" | end nil ruby> run quux About to call a procedure... QUUXQUUXQUUX!!! There: finished. nil |
trap 方法令到我 们 可以 对 任何系 统 信号做出我 们 自己的 选择 .
ruby> inthandler = proc{ print "^C was pressed./n" } #<Proc:0x401730a4> ruby> trap "SIGINT", inthandler #<Proc:0x401735e0> |
一般的 , 敲入 ^C 将 导 致解 释 器退出 . 但 现 在一个信息被打印出来 , 解 释 器 继续执 行着 , 所以你不会 丢 失掉正在作 业 的工作 .( 你不会永 远 留在解 释 器里 , 你仍可以用 exit 或者按 ^D 退出 )
ruby> trap "SIGINT", proc{ print "^C was pressed./n" } nil |
或着更 简 略,
ruby> trap "SIGINT", 'print "^C was pressed./n"' nil |
这种简 写 为 你提供了一 种 方便和可 读 性更 强 的写小匿名 过 程的路子 .
$
|
全局变量 |
@
|
实变量 |
[a-z] or _
|
局部变量 |
[A-Z]
|
常量 |
ruby> self main ruby> nil nil |
ruby> $foo nil ruby> $foo = 5 5 ruby> $foo 5 |
应谨 慎使用全局 变 量 . 由于在任何地方都可以被写因此他 们 相当危 险 . 滥 用全局 变 量会 导 致很 难 隔离臭虫 ; 同 时 也 视为 程序的 设计 未 经严 格考 虑 . 当你 发现 必 须 要使用全局 变 量 时 , 记 得 给 它一个不会在其它地方一不小心就用到的描述性名字 ( 像上面那 样 叫 $foo 可能不是一个好想法 ).
全局 变 量的好 处 是其可以被跟踪 ; 你可以做一个当 变 量 值 改 变时 被 调 用的 过 程 .
ruby> trace_var :$x, proc{print "$x is now ", $x, "/n"} nil ruby> $x = 5 $x is now 5 5 |
这 里列出了一些以 $ 打 头 并跟 单 个字符的特殊 变 量 . 比如 ,$$ 包含了 Ruby 解 释 器的 进 程 id, 它是只 读 的 . 这 里是主要的系 统变 量以及它 们 的含 义 ( 细节 可在 Ruby 的 参考手册 中 查 到 ):
$!
|
最近一次的错误信息 |
$@
|
错误产生的位置 |
$_
|
gets最近读的字符串
|
$.
|
解释器最近读的行数(line number) |
$&
|
最近一次与正则表达式匹配的字符串 |
$~
|
作为子表达式组的最近一次匹配 |
$ n
|
最近匹配的第n个子表达式(和$~[n]一样) |
$=
|
是否区别大小写的标志 |
$/
|
输入记录分隔符 |
$/
|
输出记录分隔符 |
$0
|
Ruby脚本的文件名 |
$*
|
命令行参数 |
$$
|
解释器进程ID |
$?
|
最近一次执行的子进程退出状态 |
上面的 $_ 和 $~ 都有作用范 围 . 它 们 的名字暗示其 为 全局的 , 但它 们 一般都是 这样 用的 , 关 于它 们 的命名有 历 史上的原因 .
Ruby 的 实变 量用不着声明 . 这 暗含着 对 象的 弹 性 结 构 . 实际 上 , 每 个 实变 量都是在第一次出 现时动态 加入 对 象的 .
ruby> class InstTest | def set_foo(n) | @foo = n | end | def set_bar(n) | @bar = n | end | end nil ruby> i = InstTest.new #<InstTest:0x83678> ruby> i.set_foo(2) 2 ruby> i #<InstTest:0x83678 @foo=2> ruby> i.set_bar(4) 4 ruby> i #<InstTest:0x83678 @foo=2, @bar=4> |
注意上例中直到 调 用了 set_bar 方法 i 才 报 告 @bar 的 值 .
ruby> $foo nil ruby> @foo nil ruby> foo ERR: (eval):1: undefined local variable or method `foo' for main(Object) |
对 局部 变 量的第一次 赋值 做的很像一次声明 . 如果你指向一个未初始化的局部 变 量 ,Ruby 解 释 器会 认为 那是一个方法的名字 ; 正如上面所 见错误 信息的 .
- proc{...}
- loop{...}
- def...end
- class...end
- module...end
- 整个程序(除非符合上面某个条件)
下面的例子 , define? 是一个 检查标识 符是否已定 义 的操作符 . 如果已定 义 它将返回 标识 符的描述 , 否 则 返回 nil . 正如你所 见 的 , bar 的范 围 是 loop 的局部 变 量 ; 当 loop 退出 时 , bar 无定 义 .
ruby> foo = 44; print foo, "/n"; defined? foo 44 "local-variable" ruby> loop{bar=45; print bar, "/n"; break}; defined? bar 45 nil |
一个范 围 内的 过 程 对 象共享 这 个范 围 内的局部 变 量 . 这 里 , 局部 变 量 bar 由 main 和 过 程 对 象 p1, p2 共享 :
ruby> bar=0 0 ruby> p1 = proc{|n| bar=n} #<Proc:0x8deb0> ruby> p2 = proc{bar} #<Proc:0x8dce8> ruby> p1.call(5) 5 ruby> bar 5 ruby> p2.call 5 |
注意 开 始的 " bar=0 " 不能省略 ; 此 赋值 允 许 bar 的范 围 被 p1 和 p2 共享 . 不然 p1, p2 将会分 别 生成并 处 理它 们 自己的局部 变 量 bar , 调 用 p2 也将 导 致 " 未定 义 局部 变 量或方法 " 错误 .
过 程 对 象的 强 大在于它 们 能被作 为 参数 传递 : 共享的局部 变 量即使 传递 出原范 围 也仍然有效 .
ruby> def box | contents = 15 | get = proc{contents} | set = proc{|n| contents = n} | return get, set | end nil ruby> reader, writer = box [#<Proc:0x40170fc0>, #<Proc:0x40170fac>] ruby> reader.call 15 ruby> writer.call(2) 2 ruby> reader.call 2 |
Ruby 对 待范 围 的 办 法相当 聪 明. 显 然,上面例子里 contents 变 量是由 reader 和 writer 共享的.我 们 也可以像上面那 样创 造多 对 使用 box 的 reader-writer ; 每 一 对 共享一个 content s 变 量, 对 之 间 不相干 扰 .
ruby> reader_1, writer_1 = box [#<Proc:0x40172820>, #<Proc:0x4017280c>] ruby> reader_2, writer_2 = box [#<Proc:0x40172668>, #<Proc:0x40172654>] ruby> writer_1.call(99) 99 ruby> reader_1.call 99 ruby> reader_2.call 15 |
ruby>fluid=30 30 ruby>fluid=31 31 ruby>Solid=32 32 ruby>Solid=33 (eval):1: warning: already initialized constant Solid 33 |
ruby> class ConstClass | C1=101 | C2=102 | C3=103 | def show | print C1," ",C2," ",C3,"/n" | end | end nil ruby> C1 ERR: (eval):1: uninitialized constant C1 ruby> ConstClass::C1 101 ruby> ConstClass.new.show 101 102 103 nil |
ruby> module ConstModule | C1=101 | C2=102 | C3=103 | def showConstants | print C1," ",C2," ",C3,"/n" | end | end nil ruby> C1 ERR: (eval):1: uninitialized constant C1 ruby> include ConstModule Object ruby> C1 101 ruby> showConstants 101 102 103 nil ruby> C1=99 # not really a good idea 99 ruby> C1 99 ruby> ConstModule::C1 # the module's constant is undisturbed ... 101 ruby> ConstModule::C1=99 ERR: (eval):1: compile error (eval):1: parse error ConstModule::C1=99 ^ ruby> ConstModule::C1 # .. regardless of how we tamper with it. 101 |
file = open("/tmp/some_file", "w")
# ... write to the file ...
file.close
rescue
file.close
fail # raise an exception
end
- 上一篇:Command模式
- 下一篇:(整理)RUBY的CGI访问
- 5楼 youyang1991 2011-07-15 17:12发表 [回复]
- so useful !!!
- 4楼 youyang1991 2011-07-15 14:58发表 [回复]
- 大谢楼主了!
- 3楼 Duallay 2011-06-20 13:54发表 [回复]
- 言简意赅,好,顶一个!
- 2楼 GreenLearner 2009-11-03 20:32发表 [回复]
-
ruby> var = " abc "
" abc "
ruby> "1234#{var}5678"
ERR:undefined local variable or method 'var' for main:Object这个错误是什么原因啊,怎么改正这个错误呢?
- 1楼 GreenLearner 2009-11-03 16:08发表 [回复]
-
ruby> var = " abc "
" abc "
ruby> "1234#{var}5678"
ERR:undefined local variable or method 'var' for main:Object
- 用 户 名:
- xzyxuanyuan
- 评论内容:
- 个人资料
Last_Impression- 访问:158409次
- 积分:4154分
- 排名:第1138名
- 原创:230篇
- 转载:137篇
- 译文:8篇
- 评论:22条
- 文章搜索
- 文章分类
- C#(4)
- C++(27)
- C++ STL(36)
- C++单体测试(10)
- C++设计模式(QT)(7)
- C语言(21)
- Offshore时代的统筹人(9)
- Qt(32)
- Ruby(6)
- VB语言(3)
- VC++多线程应用(6)
- Windows程序设计(28)
- YACC(14)
- 外语(1)
- 孙鑫VC++(7)
- 数据库系统概论(12)
- 数据结构(19)
- 测试&&品质(23)
- 系统分析师-论文(4)
- 职场我见(17)
- 设计模式(5)
- 重构(3)
- 项目管理(5)
- 嵌入式(31)
- 大话设计模式(23)
- 人件(14)
- 人月神话(2)
- 文章存档
- 2013年05月(2)
- 2013年04月(2)
- 2013年03月(6)
- 2013年02月(1)
- 2013年01月(7)
展开
- 阅读排行
- (转)国企,私企与外企利弊通观--关键时刻给应届毕业生及时点拨(9965)
- (转)国企,私企与外企利弊通观--关键时刻给应届毕业生及时点拨5(4899)
- (转) 5.3把自定义控件集成到Qt Designer中(Integrating Custom Widgets with Qt Designer)(2116)
- (转)日元汇率下跌与中国工资上涨 -- 苦于效益减少35%的中国企业(对日外包)(1987)
- (转)R语言入门(1973)
- 第2章 关系数据库(数据库系统概论)(1799)
- (转)4.2从QTableWidget继承(Subclassing QTableWidget)(1795)
- 软件质量管理(1769)
- (转)移植32位程序64位系统(1709)
- 人件--读书笔记5(1580)
- 评论排行
- (整理)Ruby的基础知识(5)
- 数据结构之冒泡排序(2)
- (转)char,wchar_t,TCHAR 3者的区别与联系(2)
- (转)QT事件机制(2)
- 泛型算法系列15:transform()(1)
- 泛型算法系列19:remove_if()&&remove_copy_if()(1)
- 软件测试管理和测试流程(1)
- 数据结构之快速排序(1)
- ITRON的任务管理(1)
- 复习四:C的OOP-多层继承(1)
- 推荐文章
- 最新评论
- 数据结构之冒泡排序
zwbrs555: 好不赖,多谢
- 第七章 鼠标part2
coding_my_life: 谢谢分享!请问这样的代码是怎么贴上去的啊?
- ITRON的任务管理
qiaohao666666: 果断关注了~
- 泛型算法系列19:remove_if()&&remove_copy_if()
sunmofeng: 能给我讲下remove_copy_if泛型算法吗?不懂
- (整理)Ruby的基础知识
youyang1991: so useful !!!
- (整理)Ruby的基础知识
youyang1991: 大谢楼主了!
- (整理)Ruby的基础知识
Duallay: 言简意赅,好,顶一个!
- (转)QT事件机制
也许飞:
- 泛型算法系列15:transform()
mmd7437: 您好,请问 _DEBUG_RANGE(_First1, _Last1); _DEBU...
- (转)char,wchar_t,TCHAR 3者的区别与联系
牛肉圆粉不加葱:
- 公司简介| 招贤纳士| 广告服务| 银行汇款帐号| 联系方式| 版权声明| 法律顾问| 问题报告
- QQ客服 微博客服 论坛反馈 联系邮箱:webmaster@csdn.net 服务热线:400-600-2320
- 京 ICP 证 070598 号
- 北京创新乐知信息技术有限公司 版权所有
- 世纪乐知(北京)网络技术有限公司 提供技术支持
- 江苏乐知网络技术有限公司 提供商务支持
- Copyright © 1999-2012, CSDN.NET, All Rights Reserved
(整理)Ruby的基础知识相关推荐
- 初一计算机基础知识试题及答案,【2017年整理】计算机基础知识试题及答案.doc...
[2017年整理]计算机基础知识试题及答案 (一)单选题(40)1.在资源管理器窗口中,被选中的文件或文件夹会____B___.A.加框显示 B.反像显示C.加亮显示 D.闪烁显示2.在Windows ...
- html语言需要dw吗,HTML笔记整理1 -- HTML基础知识与DW简单使用
HTML笔记整理1 -- HTML基础知识与DW简单使用概念客户端和服务器端文件名.基本名.扩展名资源文件和站点什么是HTML关于W3CW3C的规范网站与网页基本概念网页的制作网页的基本框架通过记事本 ...
- dw边框弧度设置_笔记整理1 -- HTML基础知识与DW简单使用
笔记整理1 -- HTML基础知识与DW简单使用 笔记整理1 -- HTML基础知识与DW简单使用 概念 客户端和服务器端 文件名.基本名.扩展名 资源文件和站点 什么是HTML 关于W3C W3C的 ...
- 阿里深资架构师整理的Java 基础知识小抄 赶紧收藏
本篇算是 Java 的基础知识小抄吧,之所以说小抄是因为觉得涵盖不是很细很全,但是基本的内容都有,当然后头还会继续完善,只是不会再用笔记录了!按照现在的习惯,先附上一张思维导图: 1. 安装与环境配置 ...
- 终于有华为高工整理网工基础知识完整版,看完就入门
前言 网络工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员.根据招聘网站最新一年数据统计,网络工程师月平均工资可以达到12.3K,而2021年较2020年增长了18%. 网络工程 ...
- java中计算机基础知识_整理一些计算机基础知识!
为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了"开放系统互联参考模型",即著名的OSI/RM模型(Ope ...
- hrrn算法java_整理一些计算机基础知识!(不定期更新)
1.网络层次划分 为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了"开放系统互联参考模型",即著名的OSI ...
- 整理一些计算机基础知识! 1
本文来自云栖社区官方钉群"Python技术进阶",了解相关信息可以关注"Python技术进阶". 1.网络层次划分 为了使不同计算机厂家生产的计算机能够相互通信 ...
- 呕心沥血整理的python基础知识与练习题【你值得拥有!!!!】
一.基础语法 1.输入与输出(hellw word) # 国际化输出 print("hello word") print("word",end=" & ...
最新文章
- 今晚8点开播 | 微信高级研究员解析深度学习在NLP中的发展和应用
- JZOJ.5234【NOIP2017模拟8.7】外星人的路径
- Part 2 — Making Sense of Smart Contracts
- 1-2-3 CodeForces - 863C(规律+思维)
- JEECG Framework 3.5.0 GA 新版本终于发布了,重量级功能(数据权限,国际化,多数据源),团队会努力推出新版本,希望大家多多支持!!
- 海德堡大学 BMCV 组(Master/Diploma/Bachelor)研究机会,生物医学图像分析方向
- 华科计算机专硕英语几,考研考华科计算机考数学几英语几啊,另外考华科数..._考研_帮考网...
- matlab 随机森林 分类,randomforest-matlab 随机森林分类器的MATLAB代码 - 下载 - 搜珍网...
- 大数据可视化平台有什么特点
- SVG 动画(animate、animateTransform、animateMotion)
- IPFS(DRAFT 3) 中文版白皮书
- vscode中显示隐藏文件
- 微信支付申请及简单使用
- 用PHOTOSHOP给图片打马赛克
- 微信小程序开发(三)注册小程序app.js
- Discuz!X3.4全新安装详细图文教程
- 32位汇编语言学习笔记(43)-- 生成随机数
- 机器人行业中我们常说的roll、yaw、pitch是什么?
- vue 项目 前端 模拟后端接口数据(vue2,vue3)
- (三)基于Multisim的电台发射系统:高频功率放大器的设计
热门文章
- 【android】喜马拉雅FM sdk使用
- PageHelper.startPage与PageHelper.offsetPage区别
- IOS 插屏广告弹窗
- Switch 开关 文字设置在一边显示
- 手机端网页设计尺寸大小
- 酒越陈越醇,OPPO Reno越更越香
- 评论回复功能 asp.net_微信重大更新!公众号推送时间线打乱+7大新功能上线!怎么玩?...
- 集 8 万员工之力, Google 开放 Bard,我们将它和 ChatGPT 正面 PK 了一下
- Big O, Big Omega, Big Theta的含义
- python自动表单填充工具(内含rar)