Ruby和Python的区别
- Python的解析器实现更成熟,第三⽅库质量⾼。但是Ruby包管理更简单、⽅便。
python语法更简便,ruby语法更灵活、强大、性能强大
python相当于拼音,ruby相当于双语,但是ruby语法提示需要安装插件从网络上获取 - Python的应⽤领域⼴泛。⽽Ruby⽬前主要局限在在Web领域与精致项⽬。
- Python语法简单,Ruby更强⼤、灵活
常用命令:
**ruby –version:**查看目前电脑的ruby环境
Ruby安装
Ruby Version Manager
rvm & rbenv
- rvm & rbenv是⼀种命令⾏⼯具,可让您轻松地安装,管理和使⽤多个Ruby环境。
- 这两个⼯具本质都是在 PATH 上做⼿脚,⼀个在执⾏前,⼀个在执⾏中。
- 如果你不需要维护特定版本的 Ruby 项⽬,那么只需要装⼀个⽐较新的 Ruby 版本就⾏了。目前ruby3.0对很多工具存在兼容问题
- 如果想深入学习,可以先了解rvm管理工具
常用命令:
- rvm list know: 当前rvm能够管理的ruby版本
- rvm list: 显示当前电脑可用的ruby版本
- rvm install ruby-2.7.3: 通过rvm安装指定版本的ruby环境
- rvm install ruby –head: 安装目前rvm可以安装的ruby的最高版本
gem命令
- 与⼤多数的编程语⾔⼀样,Ruby 也受益于海量的第三⽅代码库。
- 这些代码库⼤部分都以 Gem 形式发布。 RubyGems 是设计⽤来帮助创建,分
享和安装 这些代码库的。
- gem search -r/-f
- gem install –version
- gem list
Bundler
• Bundler 能够跟踪并安装所需的特定版本的 gem,以此来为 Ruby 项⽬提供⼀致的运⾏环境。
- source ‘rubygems.org‘ :指定的源
- gem ‘rails’, ‘4.1.0.rc2’ : 需要的库的版本
- gem ‘rack-cache’
- gem ‘nokogiri’, ‘~> 1.6.1’
rvm会从Gemfile里面的描述的指定的源拉取需要的库,然后会生成一个Gemfile.lock,这个文件是用来记录每次只需bundle install时候的版本信息,其中Gemfile里面的语法跟podfile语法一样
cocoapods就是仿照rvm,用于iOS开发
调试
ruby-debug-ide gem — 中间件
ruby-debug-ide提供了交互环境。和IDE(例如RubyMine,Visual Studio Code或Eclipse)之间建⽴通信的协议。“ ruby -debug-ide”将命令从IDE重定向到调试器。然后,它将从调试器收到的答案/事件返回给IDE。
安装方式:
gem install ruby-debug-ide
复制代码
注意的是这个安装是安装到指定版本的ruby环境下的,所有的ruby工具都是依赖ruby版本进行安装的
debase — 真正的调试器
- debase是针对Ruby 2.0的标准Ruby调试器debug.rb的快速实现。它是通过利⽤新的Ruby TracePoint类实现的。核⼼组件提供了前端可以建⽴的⽀持。它提供断点处理,堆栈信息等。
安装方式:
gem install debase
复制代码
bundle exec
- 使⽤bundle exec运⾏命令时,默认会将gemfile⽂件中指定的gem加载到ruby程序中。
rubocop
- Rubocop 是基于 ruby-style-guide / Ruby ⻛格指导 实现的⼀个代码⻛格检查器
solargraph
- solargraph是⼀种语⾔服务器,为Ruby提供智能感知,代码完成和内联⽂档。
在写ruby脚本时候会有提示,并不是类似xcode注释一样点进去可以看到实现,ruby的提示适合本机安装的一个gem插件,然后去访问网络提示的,用到的就是solargraph
一般复杂的脚本都是用ruby。
env
- printf “\n”env”: {\n “PATH”: “$PATH”,\n “GEM_HOME”:
“GEM_HOME\”,\n \”GEM_PATH\”: \”GEM_PATH”,\n
“RUBY_VERSION”: \”$RUBY_VERSION”\n}\n\n”
- 按照VSCode Ruby配置规则,输出环境变量
VSCode插件
- Ruby : 在vscode里面所有的插件不代表一个功能,他代表的是一个中间件,是用来和本机ruby环境进行沟通的
- Solargraph Autocomplete Tip : 提示插件
- Error Lens :判断当前代码是否存在问题的插件
调试:
- 在vscode项目目录下创建.vscode,然后在里面创建launch.json文件
{
// https://github.com/rubyide/vscode-ruby/wiki/2.-Launching-from-VS-Code#available-vs-code-defined-variables
"configurations": [
{
"name": "Debug Ruby Code",
// 输出调试信息
"showDebuggerOutput": true,
// 告诉VS Code要运行什么调试器。
"type": "Ruby",
// "launch"允许直接从VS Code启动提供的程序-或"attach"-允许您附加到远程调试会话。
"request": "launch",
// rdebug-ide在内运行bundler exec
"useBundler": true,
// 始终在入口处停止
"stopOnEntry": false,
// "program"的工作目录
"cwd": "${workspaceRoot}",
// 指定调试脚本,调试当前打开的文件"program": "${file}"
"program": "${file}",
// 提供program命令参数
"args": [],
// 启动程序之前,提供要设置的环境变量
"env": {
"PATH": "/Users/ws/.rvm/gems/ruby-2.6.0/bin:/Users/ws/.rvm/gems/ruby-2.6.0@global/bin:/Users/ws/.rvm/rubies/ruby-2.6.0/bin:/Users/ws/.rvm/bin:/usr/local/opt/llvm@11/bin:/usr/local/opt/sqlite/bin:/usr/local/opt/openssl@1.1/bin:/usr/local/opt/openssl@1.1/bin:/usr/local/opt/ruby/bin:/Users/ws/thirdpartyLib/custom:/Users/ws/.yarn/bin:/Users/ws/.config/yarn/global/node_modules/.bin:/Users/ws/thirdpartyLib/jtool/jtool2:/usr/libexec/java_home:/Users/ws/thirdpartyLib/protobuf37/bin:/Users/ws/.pub-cache/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/Apple/usr/bin",
"GEM_HOME": "/Users/ws/.rvm/gems/ruby-2.6.0",
"GEM_PATH": "/Users/ws/.rvm/gems/ruby-2.6.0:/Users/ws/.rvm/gems/ruby-2.6.0@global",
"RUBY_VERSION": "ruby-2.6.0"
}
}
]
}
复制代码
存在问题就是因为ruby的插件都是按照再指定版本下的,假如电脑当前的ruby环境和configurations里面指定的版本不一致时候,就会出现问题 。而这个configurations就是给当前vscode里面编写的ruby脚本运行的环境变量,关于这个configurations可以通过上面env的那个命令自动生成
Symbol
- Ruby 是⼀个强⼤的⾯向对象脚本语⾔,⼀切皆是对象
- 在 Ruby 中 Symbol 表示“名字”,⽐如字符串的名字,标识符的名字。
- 创建⼀个 Symbol 对象的⽅法是在名字或者字符串前⾯加上冒号:
- 在 Ruby 中每⼀个对象都有唯⼀的对象标识符(Object Identifier)
- 对于 Symbol 对象,⼀个名字唯⼀确定⼀个 Symbol 对象 Ruby 内部⼀直在使⽤ Symbol,Ruby内部也存在符号表
- Symbol 本质上是⼀个数字,这个数字和创建 Symbol 的名字形成⼀对⼀的映射;⽽String 对象是⼀个重量级的⽤C结构体表示的家伙,因此使⽤ Symbol 和 String 的开销相差很⼤。
- 符号表是⼀个全局数据结构,它存放了所有 Symbol 的(数字ID,名字)。 Ruby 不会从中删除 Symbol ,因此当你创建⼀个 Symbol 对象后,它将⼀直存在,直到程序结束。
cocoapods-binary
- cocoapods-binary 通过开关,在 pod insatll 的过程中进⾏ library 的预编译,⽣成framework,并⾃动集成到项⽬中。
- 整个预编译⼯作分成了三个阶段来完成:
- binary pod 的安装
- binary pod 的预编译
- binary pod 的集成