• Haskell 逆波兰计算例子 at 2013年05月09日

    #9 楼 @chenge

    def solveRPN rpnexp
     rpnexp.split.inject [] do |stack, c|
      stack<<("+-*\\".include?(c)? stack.pop(2).reverse.map(&:to_f).inject(c) : c)
     end.first
    end
    solveRPN "10 4.1 3.0e1 + -2 * -"
    
    require "scanf"
    def solveRPN1 exp
      stk=[];
      exp.split.each{|c|stk<<(c.scanf('%f').first||stk.pop(2).reverse.inject(c))}
      stk.first
    end
    solveRPN1 "10 4.1 3.0e1 + -2 * -"
    
  • Haskell 逆波兰计算例子 at 2013年05月09日
  • Ruby 的库

    static VALUE
    rb_ary_reverse_m(VALUE ary)
    {
        long len = RARRAY_LEN(ary);
        VALUE dup = rb_ary_new2(len);
    
        if (len > 0) {
            VALUE *p1 = RARRAY_PTR(ary);
            VALUE *p2 = RARRAY_PTR(dup) + len - 1;
            do *p2-- = *p1++; while (--len > 0);
        }
        ARY_SET_LEN(dup, RARRAY_LEN(ary));
        return dup;
    }
    
  • 👍

  • #60 楼 @chenge @zgm ^_^ , 又小改了一下。

  • 北风乱,夜未央,你的影子。。。

    dot = ->{
      i = 0; j = 150
      -> {
        i += 1; (i=0 ; j+=1) if i % 2== 0
        j = 16 if  j > 231
        "\e[38;5;#{j}m█"
      }
    }[]
    
    class Array
      def show_chars
        print  "\n" * 2
        each do |x|
            x.each_char{|x| print x; sleep 0.06};
            print "\n"*2
        end
        true
      end
    end
    (
    a=["\n\n",
    " ", "0", "0", "0", "0", "0", "0", " ", " ", " ", " ", " ", " ", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", "0", "0", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", "0", " ", " ", " ", " ", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", "0", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", 
    " ", "0", "0", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", "0", "0", "0", "0", "\n", 
    " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0","0","\n",
    "-","-","-","-","-","-","-","-","-","-","-","-","-","-","-",];
    header =[
    "北风乱,夜未央,你的影子",
    "剪不断,徒留我孤单在",
    "湖面成雙!",
    ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",];
    footer = [
    "OOOOOnly youuuuuuu\no   祝所有母亲   u\no   五月十二日   u\no   节日快乐!!   u\nOOOOOnly youuuuuuu\n\n",]
    )
    (
    print "\n"*25
    header.show_chars
    3.times{
      a.each {|x| print ((x=="0")? dot[]:x) ; sleep 0.006 }
      a.join.split("\n").reverse.join("\n").each_char {|x| print x; sleep 0.003}
    }; 
    footer.show_chars
    )
    
    "^_^"
    
  • 《Ruby 元编程》中的禅师 at 2013年05月07日

    1、DRY 2、拥抱变化

  • @luikore@zfjoy520 @zgm 致敬

    dot = ->{
      i = 0
      j = 150
      -> {
        i += 1
        if i % 2== 0
          i = 0
          j += 1
        end
        if j > 231
          j = 16
        end
        "\e[38;5;#{j}m█"
      }
    }[]
    !(a=["\n","\n",
    " ", "0", "0", "0", "0", "0", "0", " ", " ", " ", " ", " ", " ", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", "0", "0", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", "0", " ", " ", " ", " ", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", "0", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", 
    " ", "0", "0", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", "0", "0", "0", "0", "\n", 
    " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", 
    " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0","0", "\n","\n"];)
    
    10.times{
      a.each {|x| print ((x=="0")? dot[]:x) ; sleep 0.009 }
      a.each {|x| print x; sleep 0.006}
    }
    "over"
    
    
  • #55 楼 @zgm 第二个是个笔误。第一个 pry 中会显示数组,需要“q”退出后,才运行后面的循环。

  • #51 楼 @zfjoy520 👍

    !(a=[" ", "0", "0", "0", "0", "0", "0", " ", " ", " ", " ", " ", " ", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", "0", "0", "0", "0", "\n", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", "0", " ", " ", " ", " ", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", " ", "0", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", "0", "\n", " ", "0", "0", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", "0", "0", "0", "0", "\n", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", " ", " ", " ", " ", "0", " ", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", "0", "0", " ", " ", " ", "0", "0", " ", " ", " ", "0", "0", "\n", " ", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "0", "0", " ", " ", " ", " ", "0", "0", " ", " ", " ", " ", "0", "0", "\n"];)
    10.times{
      puts ("\n\n\n")
      !a.each {|x| print x; sleep 0.008 }
    }
    "over"
    
  • Ruby 的类变量 at 2013年05月04日

    #33 楼 @zgm 😄 看你怎么理解了。 我从来没有说 ruby 类变量有问题! 只是和静态语言不同,有点复杂(对于我)。

    位置 scope 优先继承!

    class W; @@w = 1;end
    class W11 < W; end
    class W1x 
      @@w =2
      def W11.hi
          @@w
      end
    end
    W11.hi           #=>2 , ( 静态位置优先与继承)
    W11.class_variable_get :@@w  #=>1
    
  • Ruby 的类变量 at 2013年05月04日

    #29 楼 @zgm 我的意思说我的原例子是有问题。原因和本贴的第一个例子一样。@@v 的定义不是在 singleton 函数的静态外层!

    这是个错误可以验证本贴结论的正确:

    方法中访问类变量,查找

    1. 方法定义的外层类的类变量。(外层,方法定义的静态位置!!!,注意 singleton 方法)

    如果要改的话如下:

    class C2;@@var2 = 200;end 
    class D
      def self.hi1          #外层D类中没有定义@@var
        @@var2
      end
    end
    D.hi1   #err
    
    class C3
      @@var2=300
      def D.hi;@@var2;end    # 方法的外层类的类变量@@var2=300
    end
    D.hi   #=>300
    
  • Ruby 的类变量 at 2013年05月04日

    #12 楼 @zgm 外层类的父类的 ancestors,反向查找。Ojbect 中的类变量最优先!没有错

    class A
      @@v = 2
      p  @@v.object_id      #x
      $t = @@v
    end
    @@v = 1
    @@v.object_id           #y
    
    A.class_variable_get :@@v #=>1
    
    class A
       p @@v.object_id      #y  这时 内层的@@v object_id已经变了!
       @@v = 3                 #z
    end 
    
    @@v     #=>3              #z
     $t         #-=>2  #  $t没有变 ,外层@@v优先
    
    
  • Ruby 的类变量 at 2013年05月04日

    #12 楼 @zgm 多谢。这个例子我是错了。刚才看了会电视大。我有点想当然了,类常量是容易错。不建议用! ^_^。

    但不影响结论。 外层是静太外层。@@var 没有在 def D.hi;@@var;end 的外层。

    class C2;@@var2 = 200;end 
    class D
      def self.hi1          #外层D类中没有定义@@var
        @@var
      end
    end
    D.hi1   #err
    
    class C2
      def D.hi;@@var;end    # 方法的外层类的类变量@@var=200
    end
    D.hi   #=>200
    
  • Array 方法为什么是大写? at 2013年05月04日

    工厂方法吧

  • Ruby 的类变量 at 2013年05月04日

    #8 楼 @Tony612 #9 楼 @Tony612 http://cirw.in/blog/constant-lookup.html 这是关于常量的。类变量是我用 pry 做实验得出的结论。多用 pry 或 irb。

    class A
      @@v = 2
    end
    @@v = 1
    A.class_variable_get :@@v #=>1
    
    class A
      def hi
        @@v
      end
    end 
    A.new.hi  #=>1
    
  • Ruby 的类变量 at 2013年05月04日

    #5 楼 @zgm 上面都是例子呀 常量和类变量:self (动态)+ scope(静态)都有关。关联多一点,独立性差一点。

  • Ruby 的类变量 at 2013年05月04日

    #3 楼 @zgm 易出错。instance_variable,函数参数传递 安全。

  • Ruby 的类变量 at 2013年05月04日

    #1 楼 @chenge :确实不建议使用类变量。动态编程,类变量很容易出错,类变量和常量有许多相通之处,但更复杂些。韩信用兵吧,^_^。 但有两点意义:

    1. 比全局变量好,提倡用 Object 的类变量替代全局变量。
    2. 加深 ruby 语言的理解。
  • #7 楼 @zgm 好例子! 👍 琢磨了很久:

    1. "戴帽" :: 访问常量最好,M::N。
    2. 如常量 M::N 不变 😄 ,可以在 lnclude 后,新定义一个的同名常量。(见代码)。
    module M
      N = 1
    end
    
    class C
      include M     #常量定义在 M中
      N = N         #C::N=M::N 
      def self.foo
        puts N
      end
      class << self
        def bar      
          puts N    #可以访问外层的常量C::N 了
        end
      end
    end
    
    C.foo   #=>1
    C.bar   #=>1   ok
    #------------------------------------------------
    module M; N = 2; end    #改变M::N,  C中的C::N不变
    C.foo   #=> 1           
    C.bar   #=> 1
    
    
  • 关于类名常量 at 2013年04月30日

    #12 楼 #13 楼 @zw963 代码在运行时都是内存中的结构

    “有一些东西可以挖掘”

    是的。最近学 ruby,因起点不高,写这贴子,费时不少。

    class C; end    
    

    类 C | 类名 :C | 类名常量 (类名是个常量)。 (类 类 类,有点累 ^_^)

    常量的搜索:

    1. 当前作用域的常量 = self.class.constants + all superclass.constants + all mixinModule.contants
    2. 顺序:由近到远 C --> Object -->Kernel(Mixin)。

    在 irb 中

    TT = 1
    self.class.constants.grep /^TT$/
    #=>[:TT]
    Object.constants.grep /^TT$/
    #=>[:TT]
    

    因为 TT 常量加入了 superclass --- Cbject 的常量中,因此所有作用域可见


    原贴中代码在 irb 或 pry 中走一遍,欢迎小拍。应该有些需要改进的地方。

  • 关于类名常量 at 2013年04月30日

    #14 楼 @zw963 @chenge

    “我不想它被 assign , 或者 希望总可以被访问。”

    你 Wave 命名的动机论很精彩。那个讨论,引发了我对常量的思考。 什么是动态语言的动态? Class.new.new.new 可以吗?

  • 文字小游戏:attitude==100 at 2013年04月30日

    #7 楼 @chenge 我搞错了,:-)

    Proc 可以绑定环境变量。 反向不行,不能定义带出来。(block 不是嵌入呀) nc[x] = index 也不是赋值语句!!!🐻

  • 文字小游戏:attitude==100 at 2013年04月30日

    前面的 nc={} 这一句,好像可以省了。 最近琢磨 ruby,咬文嚼字了。 😊

  • 文字小游戏:attitude==100 at 2013年04月30日

    #4 楼 @chenge

    • split(//) | each_char | each_with_index
    • redue(:+) | inject(&:+),
    • collect | map,
    • ord

    这些方法放在一起练习,这个形式不错!


    def count3(word)
      word.downcase.each_char.collect{|x|x.ord - 'a'.ord + 1}.reduce(:+)
    end
    p count3('attitude')  
    
  • 文字小游戏:attitude==100 at 2013年04月30日

    #2 楼 @chenge, #1 楼 @doitian 👍
    一举两得 😄

    1. 有知识:Array,String
    2. 有内涵:Hardwork,Knowledge,Luck,Love,Money,Attitude

    def count3(word)
      word.downcase.each_char.map{|x|x.ord - 'a'.ord + 1}.inject(:+)
    end
    
    p count3('attitude')  
    
  • 如果要原生 load 一样,放入 Kernel,可以使用 class_eval。

    module Kernel
      def load3(fn)
        Object.class_eval %{                       
          eval File.read(fn)
        }
      end
    end
    
    load3 './person.rb'
    p Person
    #=>Person
    
    self.class.method(:load3)
    #=>#<Method: Class(Kernel)#load3>
    self.class.method(:load)
    #=>#<Method: Class(Kernel)#load>
    
  • js 学习有什么窍门吗? at 2013年04月29日
    • js 中对象是类,类是对象。
    • "原型链"(prototype chain)模式,来实现继承。
    • 回调
    • 其他和 ruby 差不多了 😄
  • #9 楼 @zw963 @poshboytl
    刚好我写了篇:关于类名常量,想过这个问题。http://ruby-china.org/topics/10608 打开 Object 类即可做到一致了。

    #打开Object类,Object mixin Kernel,所以可以覆盖kernel中的方法
    class Object  
      def load1(fn)
        eval File.read(fn)
      end
    end
    load1 './person.rb'
    p Person   # => Person.