Ruby Ruby 的两面性,简单和复杂

chenge · 2013年04月07日 · 最后由 chenge 回复于 2016年07月04日 · 5027 次阅读

有人问 Ruby 是否适合于初学者。

Ruby 从使用的角度说是简单的,但是它的模型是相对复杂的。对于初学编程的人来说是很不错的选择,一般编程不需要涉及复杂性的一面。

class Box
    def play
        p 'hi'
    end
end

b = Box.new
b.play

最基本的就是三要素:

  • 对象
  • 方法

上面这个代码就包含了,如果你能看懂就算入门了,大部分 ruby 代码没有超出这个难度,你都能看懂。

接下来再学习模块和块这两个特色菜,基本就齐了。

Box是一个类,playBox类的一个方法,bBox类新建的一个对象,这个对象b调用play方法,最后结果是hi, 我是不是入门了?

#1 楼 @w7938940 play 是 Box 类的对象的方法。 我是不是也入门了???

我竟然入门了

有道理,ruby 入门容易,如果不做专家不造框架,入门后就可以用 ruby 干活了

谁来说说复杂的一面呢?

大部分ruby代码没有超出这个难度,你都能看懂 我不同意你的看法。ruby 写起代码来,千变万化,各种魔法。你去读读大一点的开源项目,没点基础,看真是不太好读明白。

#5 楼 @Junyi5 复杂的就不是三言两语说清的,可参考《元编程》书,详细解释了复杂的模型。复杂是为了编程简单。

#6 楼 @qichunren 我是指的常规写法的代码。或者说是初级的代码。 你不可能让初学的人去看开源代码吧,步子是不是大了点。

class Box
    def self.play
        p 'B.p'
    end
end
Box.play

还好,这个也不难

本人前端开发一枚,ruby 新人,大致看过一遍《Ruby 编程语言》,正在看第二遍,随便看些 web 框架,问一个困扰我的问题。

require 'sinatra'

get '/hi' do
  "Hello World!"
end

get方法是sinatra暴露出来的吧。

如果是 Node 的话,基本会这么写:

var sinatra = require('sinatra')
sinatra.get('/hi',function(){
   return "Hello World!";
})

所以想问:

  1. ruby 是怎么控制变量冲突的?
  2. 如果导入了多个库,怎么识别哪些方法是哪个库的?

有没有相关的文档推荐?发现 ruby 想入个门,资料真心少。

#10 楼 @sliuqin 变量冲突用模块控制。ModuleName::Box。 判断方法的出处,一般用 ri 吧。

#10 楼 @sliuqin 那是 sinatra 的非模块化写法,小项目,肮脏点,没有关系。大项目,有意识地模块化,模块名字越奇葩越好 :)

第二个问题,还没系统总结过,现在只能凭感觉。多读读代码会培养出感觉来。 另外,你应该先搞明白方法是哪个 object 调用的,连哪个 object 都不知道的话用 pry 打开看看,知道 object 的类往往就知道哪个库了。

なにこれおいしい?

关于变量冲突的这个问题很好,其实我觉得这个方面 nodejs 比 ruby 做的要好,当然有个缺点就是写起来比较麻烦 另外 npm 的包管理比 gem 貌似也要好一点,用了段时间 nodejs 的粗浅感受,大家轻拍

#14 楼 @edokeh 现在我还没有搞懂 ruby 的包管理是怎么回事。意思是,ruby 只有一个“环境”吗? 我记得 python 也有虚拟环境之类的东西。

另外变量冲突的问题,我重从 node 过来的,对 ruby 的这个设计,很难理解,一些方法不知道是导入库的,还是标准库的。导致我入门很难啊。

#15 楼 @sliuqin 你可以看看 module, 也就是模块的部分。或者你把代码贴出来,可能更容易交流。

#15 楼 @sliuqin 确实是只有一个“环境”,所以其实会存在冲突的问题 只是大家普遍的写法是给所有的 class 外层都加上一个 module 作为 namespace,所以一般你很少碰到冲突

突然看到自己在门内了

跟楼上同感。。。

让我猜猜,这里面到底藏了多少个对象呢 XD

接触、学习、使用 ruby 第 4 年了,感觉还是啥也不懂。越来越觉得啥也不懂。

跟楼上同感。。。

chenge Ruby 学习汇集,请推荐内容 提及了此话题。 07月04日 11:35
需要 登录 后方可回复, 如果你还没有账号请 注册新账号