其实补基础有个好办法呀。看 @happypeter 的视频
我也加入了。
好吧。我承认,我是来灌水的。不过没办法,偶像的力量呀。
楼主的代码真蛋疼,问问题以前,先把你的代码格式化一下呀。让大家好看点。
我不知道你在那里看到代码,很明显执行结果不是你说的那样,因为对 10 个数字迭代,太快了,Thread.pass 来不及执行完毕,迭代器已经返回。所以输出结果在我的电脑上总是:
01234567890123456789
改成下面这样才是你想要的结果:
thread1 = Thread.new{ 10.times {|i| print i;$stdout.flush; sleep(0.1); Thread.pass }}
thread2 = Thread.new{ 10.times {|i| print i;$stdout.flush; sleep(0.1); Thread.pass }}
thread1.join
thread2.join
# => 112233445566778899
一定要看,上上次 Ruby Tuesday 的时候,Daniel 已经介绍过啦。
打不开,赞美我们伟大的 DANG
, 早死早超生吧~
楼主辛苦了~
看到这个用法的确有点吃惊...
我接受任意多个参数, 并且将这些参数作为一个数组, 传入方法定义内'. 既然 * 后面没有提供一个明确的数组名称, 那就是作为
空名称的数组` 被传入,这也就意味着,你输入任何参数,无论多少个,都作为一个没名字的数组,其实就是忽略所有的参数
可惜不是所有的字符都可以这样,我刚刚试了下
def hello(&) # => 期望这个方法无法接受 任何代码块.
end
不过不成功,因为语法本身就是错误的。: )
首先可以肯定,性能的损失来自于调用 define_method 方法 block, 如果没有这个 block 的调用,它们所花的时间一定是一样的。
一个是关键字直接定义方法,方法名作为原义被直接定义。
另一个是方法调用,而且需要通过符号获取方法名,最后内部还要完成类似于 使用关键字定义一个方法
的过程,多了一道流程,速度慢一些,但是允许通过符号动态的生成方法名称,有得有失。
我是属于那种 有点极端的
首先要 正确的做事
那种人。
不过目前为止,我并没有太大的工作压力,如果真在那种氛围下,也许我会首先做正确的事,然后稍后一定会再补上正确的方法,我绝对不会因为要做正确的事,而反复的,一而再再而三的,使用不正确的方式做事,那对我来说是不可忍受的,总的来说,正确的方法做事是非常有 Feeling 的,错误的方法做事,虽然可能会有一些短期效益,但是最终一定会得不偿失。
所以,为了养成正确做事的习惯,我宁可在金钱上,或时间上暂时牺牲,来换取未来最高效率,最短时间最好正确的事。这其实有点像开发软件的时候,存在 bug, 这个 bug 越晚发现,修复起来肯定会越困难,后期所做的修补工作所花费的工作,会几何级的增长,总体上看,绝对是得不偿失的。
知道 DHH 靠什么了解并学习 Ruby , 并最终写出 Rails 吗??
好吧。算是我做广告吧。`The Ruby way', 这本书第二版,DHH 和 Matz 写的序,DHH 自己说的。
这里有我制作的 英文 PDF 版。http://ruby-china.org/topics/6061
@fsword , 你有没有那些温度的文件呢?
有的话,打包给我发一份。[email protected], 我也好实际测试下效果如何。
我也来个 OO 版,甚至有点为了过分追求 OO 以及软件的重构而 OO.
不过代码还算清晰,基本上都是不可再分的小方法,也没有太多的参数传递,在几个月后再看代码,比单行脚本易懂一些。
(好吧,我承认,使用单行的方式来解决这么复杂的应用,我还真写不出来呢)
class City
def initialize(city_path)
@city_path = city_path
end
def average_arrays
month_days_hash.map {|month, days| [name, month, Parser.parse_temperature(days)/days.length] }
end
def month_days_hash
date_files.group_by do |date_file|
File.basename(date_file, ".txt").slice(/(\d{4}-\d{2})-\d{2}/, 1)
end
end
def date_files
Dir["#{@city_path}????-??-??.txt"]
end
def name
File.basename(@city_path)
end
class Parser
def self.parse_temperature(arrays)
arrays.inject(0) do |sum, file|
string = File.read(file)
sum += parse(string)
end
end
def self.parse(string)
string =~ /max:(.+) min:(.+)/
($1.to_f - $2.to_f).abs
end
end
end
city_directorys = Dir['city/*/']
report = city_directorys.map do |city_directory|
city = City.new(city_directory)
# 一个二维数组, 每个元素是 ["城市名", "年-月", 月平均温差(浮点数)] 形式
city.average_arrays.max_by {|e| e[2] }
end
report.each {|city| printf "%-10s在 %5s 拥有最高温差: %0.1f", *city }
下面是补上的测试,使用 Minitest.
require 'minitest/autorun'
require 'awesome_print'
require 'minitest/pride'
require_relative "test3"
describe City do
before do
@city = City.new("city/hangzhou/")
end
it "must return city name" do
@city.name.must_equal "hangzhou"
end
it "must return a month_days_hash" do
def @city.date_files
["city/hangzhou/1996-01-03.txt",
"city/hangzhou/1996-01-02.txt",
"city/hangzhou/1996-02-02.txt",
"city/hangzhou/1996-02-03.txt",
"city/hangzhou/1999-12-25.txt",
"city/hangzhou/1996-01-01.txt"]
end
@city.month_days_hash.must_equal({"1996-01"=>["city/hangzhou/1996-01-03.txt", "city/hangzhou/1996-01-02.txt", "city/hangzhou/1996-01-01.txt"], "1996-02"=>["city/hangzhou/1996-02-02.txt", "city/hangzhou/1996-02-03.txt"], "1999-12"=>["city/hangzhou/1999-12-25.txt"]})
end
specify { City::Parser.parse("max:20 min: -5").must_equal 25 }
end
个人的兴趣
第一,体面的尊严
第二。
不赞同你的观点
你所谓的 Rails中的很多理念' 除了极少部分来自于除了RESTful 和 , 真没啥东西了.
剩下的理念, 几乎全部都是来自于
Ruby` (MVC, SQL 例外), 除了以上我说的部分,剩下的只有概念了,大量的概念,头晕~~
还有你 2 楼的观点,前面扯的内容和最后的论据 所以ruby也被当成了rails的爸爸
, 根本不搭调呀。为了精通 Java 去学 C 语言,为了精通 C 语言去研究汇编,这是假爸爸, 但是 `Ruby 是 Rails 的真爸爸'.
看完才发现,The Ruby Way 第三版去年也出来了。这老兄也算厚道,5 年才出一个新版。
有个网站叫做博学网有下载,不过需要注册,有帐号的 XD 分享下吧。
http://boxuesky.com/viewthread.php?tid=170396
不过这种类型的书,不似 Rails 工具书籍,我翻了下新版的目录,貌似第二版和第三版差别不大。
我的意见:
用最甜美的,字正腔圆的中文讲出来 ... 哈~
支持~~ 真是规模好大~ 咱社区有的很有名的公司团队共才两三个人。
@lgn21st , 你终于回来啦~
我也是周二上午回上海,应该可以赶上。+1
快笑死了!!
你在开玩笑吗?维基百科呀。