新手问题 关于一些基础的语法问题

ripper · 2018年10月10日 · 最后由 yfractal 回复于 2018年10月17日 · 1365 次阅读

大家好,我刚接触 ruby,在 菜鸟教程 上看了基础语法的文档

我准备写一个辅助自己开发的命令行 gem,准备 gli 来辅助实现,但是我在看 gli 文档 的时候对其中的语法还是不理解,上面的教程没有看到这些写法,如下

#!/usr/bin/env ruby
require 'gli'
require 'hacer'

# inclue 是代表继承了 GLI 模块的 App 模块吗?
# 当前代码不在任何 Module 或者 class 内部,那这部分代码是属于哪个 Module 或者 class?
include GLI::App

program_desc 'A simple todo list'

# flag [:t,:tasklist] 是调用了一个方法?[ ] 代表的什么?: 又代表什么?
flag [:t,:tasklist], :default_value => File.join(ENV['HOME'],'.todolist')

# 这里没有迭代,为什么可以直接用 do?是什么意思?
pre do |global_options,command,options,args|
  $todo_list = Hacer::Todolist.new(global_options[:tasklist])
end

# 这里是代码调用了 command 方法 创建了一个名为 add 的对象?
# 同上,这儿的 do 是怎么回事儿?
command :add do |c|
  c.action do |global_options,options,args|
    $todo_list.create(args)
  end
end

可能问的很肤浅,不过本人确实是刚刚接触,实在没有查到关于这些语法的解释

希望大家可以从语法上给我讲解一下,非常感谢了 🙏

command :add do |c|
  c.action do |global_options,options,args|
    $todo_list.create(args)
  end
end

等价于:

command(:add) do |c|
  c.action do |global_options,options,args|
    $todo_list.create(args)
  end
end

command(:add) 会返回一个方法,后面的代码块是这个方法的"参数"。

early 回复

非常感谢,我明白了!👍

Ruby 可以省略括号,且 Ruby 几乎所有语句都是方法调用。

不要用 菜鸟教程 来入门。。。 菜鸟教程是临时忘记某个语法来查的。。。去买本专门的 ruby 的书。从头学(

当前作用域应该是顶级作用域把,self 是 main,self.class 应该是 Object

a-wing 回复

好的,那我换种方式

yfractal 回复

恩啊,也是第一次学这种

ad583255925 回复

顶级作用域的话,意思是哪里都可以调用这里的方法和变量吗?只要 require 了 这个文件

你需要本更好的教程:《Ruby 元编程》

ripper 回复

我是想说,用这两条原则,可以理解一些看起来很神奇的代码。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号