查看: 3167|回复: 4

[已经解决] 关于脚本学习中的一些疑问

[复制链接]
梦石
2
星屑
34497
在线时间
614 小时
注册时间
2014-7-18
回帖
647

MZ评测员开拓者

发表于 2015-8-18 22:57:18 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
正在学习脚本,有以下几个问题:
①instance_eval和class_eval这两个方法分别有什么用,是干什么的?链接:https://rpg.blue/thread-154785-3-1.html这个贴的3页77楼。
②1.p respond to?:foo  #true     这里面respond to?什么意思?
  2.class << obj  这里的<<方法是什么意思?给个贴让我学一下...(记得以前有过介绍的贴)
    3.instance_method是什么方法,有什么用
    4.m_foo_unbound.bind(obj).call  #:"klass#foo"
              bind(obj).call是什么,有什么用?
             另外,#出现在这里是什么意思?
总链接:https://rpg.blue/thread-154785-3-1.html这个贴的1页93楼。



梦石
1
星屑
23246
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2015-8-19 00:16:25 | 显示全部楼层
本帖最后由 喵呜喵5 于 2015-8-19 00:18 编辑

以下是个人想法,说实话刚接触脚本并且学Ruby的目的仅仅只是利用RM来做游戏的话,别看那个技术区那个帖子,会走火入魔的……基础都没打牢就去看这种元编程教程纯粹作死,坐等楼下Taroxd给出更好的解答:

1.其实我觉得你暂时没必要搞清楚这两个方法的区别……并且解释的话我觉得77楼说的挺详细的了……如果现在你还看不懂那些解释到底在说什么的话……你也用不上这两个方法

2.
一般在RGSS中,只要搞懂
  1. class A
  2.     def self.hello
  3.         p "world"
  4.     end
  5. end
复制代码
  1. class << A
  2.     def hello
  3.         p "world"
  4.     end
  5. end
复制代码
这两段代码作用相同
  1. class A
  2.     def self.hello
  3.         p @hello
  4.     end
  5. end
复制代码
  1. class << A
  2.     attr_reader :hello
  3. end
复制代码
这两段代码作用相同其实就够了,class << obj 进入obj的eigenclass,具体百度 Ruby eigenclass

3.返回实例方法,不玩元编程的话我想不到有什么卵用

4.
bind(obj)
将self绑定到obj上生成并返回一个bound method对象(即Method对象)。只能对下列两种对象进行绑定:调用过unbind方法的对象的类的实例;内部包含(定义某方法的)模块的类的实例。除此以外将引发TypeError异常。
[pre lang="ruby"]# 类的实例方法的UnboundMethod

class Foo
  def foo
    "foo"
  end
end

# 生成UnboundMethod `m'
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo(Foo)#foo>

# 生成Method对象,它以Foo的实例为receiver
p m.bind(Foo.new)               # => #<Method: Foo(Foo)#foo>

# 生成Method对象,它以Foo的Bar子类
# 的实例为receiver(被禁止)
#  ruby 1.8 特性: 取消了该限制

class Bar < Foo
end
# p m.bind(Bar.new)               # => -18:in `bind': bind argument must be an instance of Foo (TypeError)

# 定义同名的特殊方法也不行
class << obj = Foo.new
  def foo
  end
end
p m.bind(obj)                   # => -:25:in `bind': method `foo' overridden (TypeError)

# 模块的实例方法的UnboundMethod

module Foo
  def foo
    "foo"
  end
end

# 生成UnboundMethod `m'
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo(Foo)#foo>

# 生成Method对象,它以内部包含Foo的Bar类
# 的实例为receiver
class Bar
  include Foo
end
p m.bind(Bar.new)               # => #<Method: Bar(Foo)#foo>

# Bar的子类也包含Foo,所以没问题
class Baz <Bar
end
p m.bind(Baz.new)               # => #<Method: Baz(Foo)#foo>

# 定义同名的特殊方法也不行
class << obj = Baz.new
  def foo
  end
end
p m.bind(obj)                   # => -:27:in `bind': method `foo' overridden (TypeError)[/pre]

call 调用方法

m_foo_unbound.bind(obj).call  # => :"Klass#foo"
注释后的内容表示输出结果为 Klass#foo…………= =

   

点评

其实新版本的Ruby已经可以把 module 的 instance_method 随便绑定了…… 可惜 VA 不能  发表于 2015-8-19 10:07

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 认可答案

查看全部评分

回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-8-19 10:03:05 | 显示全部楼层
本帖最后由 taroxd 于 2015-8-19 10:11 编辑
喵呜喵5 发表于 2015-8-19 00:16
以下是个人想法,说实话刚接触脚本并且学Ruby的目的仅仅只是利用RM来做游戏的话,别看那个技术区那个帖子, ...


更好的解答:
①http://ruby-doc.org/core-2.2.2/B ... hod-i-instance_eval
   http://ruby-doc.org/core-2.2.2/Module.html#method-i-class_eval

②


愚蠢的人类为何总是不会看文档
回复

使用道具 举报

梦石
2
星屑
34497
在线时间
614 小时
注册时间
2014-7-18
回帖
647

MZ评测员开拓者

 楼主| 发表于 2015-8-19 12:01:46 | 显示全部楼层
taroxd 发表于 2015-8-19 10:03
更好的解答:
①http://ruby-doc.org/core-2.2.2/BasicObject.html#method-i-instance_eval
   http://ru ...

针对这一句:愚蠢的人类为何总是不会看文档
我给出一下解释:
我不是英国人/美国人,虽然学了点英语,但是微不足道,况且我才上初中,英语水平很低......

点评

其实这贴也是开玩笑的......  发表于 2015-8-19 12:20
那句开玩笑的,所以都有删除线了嘛233  发表于 2015-8-19 12:14
回复

使用道具 举报

梦石
2
星屑
34497
在线时间
614 小时
注册时间
2014-7-18
回帖
647

MZ评测员开拓者

 楼主| 发表于 2015-8-19 12:07:03 | 显示全部楼层
喵呜喵5 发表于 2015-8-19 00:16
以下是个人想法,说实话刚接触脚本并且学Ruby的目的仅仅只是利用RM来做游戏的话,别看那个技术区那个帖子, ...

话说鼠标脚本是不是涉及到元编程了?
我设计的游戏里需要鼠标操控,而且想要做出比较好的效果,所以想自己写鼠标脚本。
请问一下,那样需要元编程吗?(因为要做在地图上就能点击下方的功能按钮来调出菜单的功能)

点评

不通过元编程也可以写出一套鼠标脚本  发表于 2015-8-19 12:16
不需要  发表于 2015-8-19 12:15
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部