解决方法
学习基本语法很简单.围绕一些概念包围你需要更长的时间.作为一个清单
>实例变量如何工作和设置(与c#非常不同)
>与方法相关的所有内容如何只是消息传递的糖
>在代码的任何给定部分,自我意味着什么(尤其是类声明范围和方法声明范围中的自我)
> mixins
>何时使用模块,何时使用类
>类如何只是一种不同的对象
这是简单的事情.在那之后,你想要学习更多这些东西
>了解更常用的语言级回调(如method_missing和included)
>围绕定义方法的方法
>理解块,协同程序,过程以及它们如何一起工作(这可能是第一)
>了解方法解析如何工作,并选择适当数量的()或{},这将导致最少的输入
>将头部包裹在个性化的物体周围(这需要一段时间)
>停止使用所有物品,并在适当的地方坚持使用哈希
>学习元编程是否合适,何时不适合(很多很多rubyists都不熟悉)
>学习如何以更好的方式解决这些新工具的常见问题然后可以使用像C#这样的东西(构建器,适配器和策略在我看来是GoF模式中最根本的不同)
很难说这需要多长时间.对我来说,第一部分花了大约一个月玩ruby和阅读书籍.下半场可能更像是三四个(尽管那里也有铁杆学习)
至于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
现在我们实例化它两次
irb(main):006:0> t1 = TestClass.new => #<TestClass:0x7fea78ee6f78> irb(main):007:0> t2 = TestClass.new => #<TestClass:0x7fea78ed6ba0>
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
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
上面的代码是非常罕见的,因为在另一种方法中有一堆内联方法定义内容通常非常难看.使用特定实例混合模块非常强大,尤其是考虑到鸭子类型时.
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
这是更先进的东西,也是你应该达到的最后一件事,但有些情况下,做一个动态扩展是一个更优雅的解决方案,然后替代品(这是一个替代品)与大多数高级ruby一样的常见警告,不要这样做,因为你可以,只在你需要的时候这样做)