加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么我不能覆盖Ruby中的*方法?

发布时间:2020-12-17 03:48:12 所属栏目:百科 来源:网络整理
导读:我正在研究 Ruby Gem for creating presentations,我想创建一种用于定义简单直观的幻灯片的语法.我正在使用instance_eval,所以我可以在self上调用方法.这是我原本打算做的事情: slide { title 'What is Ruby?' * 'a programming language' * 'with lots of
我正在研究 Ruby Gem for creating presentations,我想创建一种用于定义简单直观的幻灯片的语法.我正在使用instance_eval,所以我可以在self上调用方法.这是我原本打算做的事情:

slide {
  title 'What is Ruby?'
  * 'a programming language'
  * 'with lots of interpreters'
  * 'lots of fun!'
}

即使我已经定义了一个*方法,我也得到了错误:

in `instance_eval’: … syntax error,unexpected ‘n’,expecting :: or ‘[‘ or ‘.’ (SyntaxError)

我已经通过创建一个名为b的简短方法来创建子弹,但它不是很好:

slide {
  title 'What is Ruby?'
  b 'a programming language'
  b 'with lots of interpreters'
  b 'lots of fun!'
}

这仅仅是翻译的限制吗?或者有办法解决它吗?

更新:如果您愿意,可以深入了解full source code,但这里有一个小例子:

class Slide
  attr_accessor :title,:bullets
end

class SlidesDSL
  attr_accessor :slides
  def slide
    @slides ||= []
    s = SlideDSL.new
    s.instance_eval(&block)
    @slides << s.slide
  end
  class SlideDSL
    def slide
      @slide ||= Slide.new
    end

    def title(text)
      slide.title
    end

    def *(text)
      bullet(text)
    end

    def b(text)
      slide.bullets ||= []
      slide.bullets << text
    end
  end
end

# load_slides_from_file
source = File.read(filename)
dsl = SlidesDSL.new
dsl.instance_eval(source,filename,0)
@slides = dsl.slides

解决方法

It seems that you are relying on syntactic sugar that is given to the
* method for many things.

事实并非如此.你可以这样做:

class Dog

  private
  def do_stuff(arg)
    puts 2 + arg
  end

end

d = Dog.new

d.instance_eval do
  do_stuff(3) 
end

--output:--
5

> instance_eval()将self更改为其接收者,在这种情况下为d.
>在Ruby中,private仅表示您无法使用显式接收器调用该方法.
>没有显式接收器的方法调用隐式使用self作为接收器.

现在,如果将方法的名称从do_stuff更改为*:

class Dog

  private
  def *(arg)
    puts 2 + arg
  end

end

d = Dog.new

d.instance_eval do
  *(3)
end

--output:--
1.rb:13: syntax error,unexpected 'n',expecting tCOLON2 or '[' or '.'

所以op依赖于正常的方法操作,而不是归因于*的任何语法糖.在instance_eval块中,您可能希望Ruby隐式执行:

self.*(3)

这相当于:

d.*(3)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读