学习红宝石需要多长时间才能学习红宝石?

唐英荣*_*唐英荣 8 ruby

开发人员学习ruby需要多长时间.并开发像stackoverflow这样的生产网站?一般.如果开发人员具有.NET经验但没有ruby和MYSQL或PostgreSQL经验.

Mat*_*ggs 15

我在.net工作了大约3 - 4年,和java工作了3年,现在我在铁路商店工作.

学习基本语法很简单.围绕一些概念包围你需要更长的时间.作为一个清单

  • 实例变量如何工作和设置(与c#非常不同)
  • 与方法相关的所有内容如何只是传递消息的糖
  • 自我在代码的任何给定部分意味着什么(尤其是类声明范围和方法声明范围中的自我)
  • 混入
  • 何时使用模块,何时使用类
  • 类如何只是一种不同的对象

这是简单的事情.在那之后,你想要学习更多这些东西

  • 了解更常用的语言级回调(如method_missing和included)
  • 围绕定义方法的方法
  • 理解块,协同程序,过程以及它们如何一起工作(这可能是第一)
  • 理解方法解析如何工作,并选择适当数量的()或{},这将导致最少的输入
  • 把头包裹在个性化的对象周围(这对我来说需要一段时间)
  • 停止使用所有东西的对象,并在适当的地方坚持使用哈希
  • 在元编程适当的时候学习,什么时候不适用(很多很多rubyists都不太了解)
  • 学习如何以更好的方式解决这些新工具的常见问题然后可以使用像C#这样的东西(构建器,适配器和策略在我看来是GoF模式方面最根本的不同)

很难说这需要多长时间.对我来说,第一部分花了大约一个月玩红宝石和阅读书籍.下半场可能更像是三四个(尽管那里也有铁杆学习)

至于MySQL/pg,它不像你必须从头开始.工具不如SSMS(imo,MS堆栈中最好的部分)那么好,但它足以让你顺利通过.如果使用rails,大部分数据库内容都会被抽象掉.如果你需要检查数据库中的某些内容,那么十分之九会启动一个脚本/控制台并只使用ActiveRecord api(这个世界太惊人了)

编辑:

对象个性化意味着每个对象实例都是它自己的"东西",它基于一个类,但可能不仅仅是那个类.这里有些例子

首先,我们建立一个班级

irb(main):001:0> class TestClass
irb(main):002:1> def tc
irb(main):003:2> puts 'testclass method'
irb(main):004:2> end
irb(main):005:1> end
=> nil
Run Code Online (Sandbox Code Playgroud)

现在我们实例化它两次

irb(main):006:0> t1 = TestClass.new
=> #<TestClass:0x7fea78ee6f78>
irb(main):007:0> t2 = TestClass.new
=> #<TestClass:0x7fea78ed6ba0>
Run Code Online (Sandbox Code Playgroud)

def一个只有的方法 t2

irb(main):008:0> def t2.only_on_t2
irb(main):009:1> puts 'this will not be accessible anywhere else'
irb(main):010:1> end
=> nil
irb(main):011:0> t1.only_on_t2
NoMethodError: undefined method `only_on_t2' for #<TestClass:0x7fea78ee6f78>
    from (irb):11
    from :0
irb(main):012:0> t2.only_on_t2
this will not be accessible anywhere else
=> nil
Run Code Online (Sandbox Code Playgroud)

重新定义从类中提取的方法,但仅限于 t1

irb(main):013:0> def t1.tc
irb(main):014:1> puts 'redeffing something picked up from the class'
irb(main):015:1> end
=> nil
irb(main):016:0> t1.tc
redeffing something picked up from the class
=> nil
irb(main):017:0> t2.tc
testclass method
=> nil
Run Code Online (Sandbox Code Playgroud)

上面的代码是非常罕见的,因为在另一种方法中有一堆内联方法定义内容通常非常难看.使用特定实例混合模块非常强大,尤其是考虑到鸭子类型时.

irb(main):018:0> module TestModule
irb(main):019:1> def tm
irb(main):020:2> puts 'this is where it gets interesting'
irb(main):021:2> end
irb(main):022:1> end
=> nil
irb(main):023:0> t2.extend TestModule
=> #<TestClass:0x7fea78ed6ba0>
irb(main):024:0> t2.tm
this is where it gets interesting
=> nil
irb(main):025:0> t1.tm
NoMethodError: undefined method `tm' for #<TestClass:0x7fea78ee6f78>
    from (irb):25
    from :0
irb(main):026:0> t1.is_a? TestModule
=> false
irb(main):027:0> t2.is_a? TestModule
=> true
Run Code Online (Sandbox Code Playgroud)

这是更先进的东西,也是你应该达到的最后一件事,但有些情况下,做一个动态扩展是一个更优雅的解决方案,然后替代品(这是一个替代品)与大多数高级红宝石一样的常见警告,不要这样做,因为你可以,只在你需要的时候这样做)