设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3453|回复: 6
打印 上一主题 下一主题

[讨论] 几个有意思的问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
1
发表于 2011-3-17 22:12:50 | 显示全部楼层
本帖最后由 苏小脉 于 2011-3-18 02:32 编辑

楼主莫非也玩 CodeGolf?试图压缩代码确实对熟悉语言接口有帮助~

1、
open('text.txt','w'){|f|f<<%q^"66RPG" == '66RPG' ? print "Yes" : print 'No'^}

2、
array=open('text.txt'){|f|f.gets.scan(/\d+/).map{|e|e.to_i}}

3、
Sprite.new.bitmap=Bitmap.new"\#{01}66'RPG'.png"

4、
Ruby 是动态类型语言,它可以通过反射机制获取运行时类型来模拟多重分派。同时,它也支持可变长度的参数列表,故而参数的个数也可是方法行为的决定因素。
在某些语言中有所谓方法重载的概念,而这个概念只是针对静态类型语言而言的。对于静态类型语言来说,方法的参数类型是方法正式签名的一部分,在编译链接时,编译器能很轻易地进行方法名的绑定,不带来任何运行时的开销。然而像 Ruby 这样的动态类型语言,实际参数的类型是不能在编译时决定的,他只能进行迟绑定,在运行时通过查找分派函数找到对应的方法,这种情况下,如果允许方法行为依动态参数类型而变化,那么就是针对动态类型语言而言的多重分派机制。理论上 Ruby 也可以像 Common Lisp 一样在语言层支持多重分派,但那样将会进一步降低方法调用时的执行效率(分派表将会更加庞大),同时这也使得语言的实现更加复杂。Ruby 灵活的参数处理能力完全能替代多重分派,所以 Ruby 迄今为止并没有在语言层支持多重分派(或是模拟的方法重载)。

5、
(变量=1).class.send(:define_method,:+){|i|3}
print"#{变量}+1=#{变量+1}"

6、
Array.send(:define_method,:sort){(D=dup).dup.inject([]){|a,e|a<<D.slice!(D.index(D.min))}}

评分

参与人数 3星屑 +416 收起 理由
IamI + 200 老板威武 = =b
fux2 + 200 DK君的老板威武!
DeathKing + 16 老板威武

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
2
发表于 2011-3-19 15:21:18 | 显示全部楼层
本帖最后由 苏小脉 于 2011-3-19 15:23 编辑

回复 沙漠点灰 的帖子

这是当初想输出"时被困扰了一下

呵呵,其实 Ruby 在字面值的处理上是很灵活的,如果双引号和单引号都需要包含在字符串中的同时又不想转义字符,就可以使用 %、%q、%Q 这三种常规定界输入字符串的语法。不过这种语法可读性很低,有时还不如直接做如下的转义:

str = "\"66RPG\" == '66RPG' ? print \"Yes\" : print 'No'"

或是:

str = '"66RPG" == \'66RPG\' ? print "Yes" : print \'No\''

如果使用 here document 的话末尾会多一个换行,自然是不如上面的方法惬意了。

另外我上面写的还有一个多余的字符,那个小写的 `q' 可以不要。

然后又发现如果利用 Shell 命令的话其实更短……

`echo "66RPG" == '66RPG' ? print "Yes" : print 'No'>text.txt`

当然这个有平台依赖性。MS-DOS 的 echo 很神奇,双引号和单引号居然没有被 Shell 当作分隔符处理,而是原封不动地被当作字面值,相比 Unix 的语法反而节省了不少字符 o_o

嘿嘿,这个,我的比沙发的短了那么一点


哈哈,厉害~虽然你这个解没有手动释放输入流的资源,但作为 code golfer 来说确实足够了,反正流最后也会被 GC 关闭……

又在你的基础上改了改,更短了:

array=eval"[#{IO.read('text.txt').gsub(/ /,',')}]"

Sprite.new.bitmap=Bitmap.new "*.png"
(某人被PIA飞,不解释)


ovO 呃,原来是在玩谓词逻辑——“根目录下有一名字为...”且“请显示它”并不逻辑涵蕴“不能显示其它图片”,所以通配符通吃了?

另外,双引号前的空格可以省略,因为对于 RUby 词法分析器来说双引号和标识符可以被轻易定界。

class Bitmap
  def draw_text(x=0, y=nil, width=0, height=nil, str=nil, align=0)
    if x.is_a(Rect)
      s1 = x.x
      s2 = x.y
      s3 = x.width
      s4 = y.height
      draw_text(s1,s2,s3,s4,y,width)
      return
    end
    XXXXXXXXXXXXXXXXXX
  end
end


嗯,Objecg#is_a? 就是反射的其中一个 API 咯~方法参数也可以直接用可变参数列表。

这个可以定义个叫变量的方法
让其第一次返回1,第二次返回2:
def 变量
  $无语 == nil ? $无语 = 1 : 2
end


也是,这么写的话,无换行,也比我那个短一点:

Object.send(:define_method,:变量){$g?2:$g=1}

沙发的答案是好,但有个BUG,这个方法具有破坏性.....
Array.send(:define_method,:sort){self.dup.sort!}


我那个没破坏性啊~就因为这牺牲了一个 dup 的空间……我也想过直接调用 sort!,但觉得太对不起观众就没敢放上来 = =

点评

O_O 我没试出来,能否提供测试代码?  发表于 2011-3-19 15:32
我试了一下,你的那个真的有破坏性.....  发表于 2011-3-19 15:26
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
3
发表于 2011-3-20 02:40:28 | 显示全部楼层
IamI 发表于 2011-3-19 19:56
我只是来吐槽这群触手排序的时候直接插排完全无视快排的本质= =b

Golfer 不關心效率,只要 stroke 少就好啦 = ='' 我那個也不是插入排序,是最最最 naive 的 badsort
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-8 18:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表