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 * -"
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;
}
北风乱,夜未央,你的影子。。。
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
)
"^_^"
1、DRY 2、拥抱变化
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"
!(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"
#29 楼 @zgm 我的意思说我的原例子是有问题。原因和本贴的第一个例子一样。@@v 的定义不是在 singleton 函数的静态外层!
这是个错误可以验证本贴结论的正确:
方法中访问类变量,查找
- 方法定义的外层类的类变量。(外层,方法定义的静态位置!!!,注意 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
工厂方法吧
#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
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
#12 楼 #13 楼 @zw963 代码在运行时都是内存中的结构
“有一些东西可以挖掘”
是的。最近学 ruby,因起点不高,写这贴子,费时不少。
class C; end
类 C | 类名 :C | 类名常量 (类名是个常量)。 (类 类 类,有点累 ^_^)
常量的搜索:
在 irb 中
TT = 1
self.class.constants.grep /^TT$/
#=>[:TT]
Object.constants.grep /^TT$/
#=>[:TT]
因为 TT 常量加入了 superclass --- Cbject 的常量中,因此所有作用域可见
原贴中代码在 irb 或 pry 中走一遍,欢迎小拍。应该有些需要改进的地方。
前面的 nc={} 这一句,好像可以省了。 最近琢磨 ruby,咬文嚼字了。
如果要原生 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>
#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.