ruby – 元编程:输出方法正文为文本
发布时间:2020-12-16 19:37:28 所属栏目:百科 来源:网络整理
导读:我在模块中动态定义一个方法,我想检查一旦方法绑定到一个类实例,该方法的正文是我期待的.有没有办法输出(作为文本)的方法的正文? 模块controller_mixins.rb: module ControllerMixin instance_eval "def search_by_vendor (*args) n" " @#{self.class.n
我在模块中动态定义一个方法,我想检查一旦方法绑定到一个类实例,该方法的正文是我期待的.有没有办法输出(作为文本)的方法的正文?
模块controller_mixins.rb: module ControllerMixin instance_eval "def search_by_vendor (*args) n" " @#{self.class.name.sub(/Controller/,'').tableize} = #{self.class.name.sub(/Controller/,'')}.find_all_by_vendor_id(params[:vendor_id]) n" "respond_to do |format| n" " format.html { render :template=>'/#{self.class.name.sub(/Controller/,'').tableize}/index',:layout=>'vendor_info'} n" " format.xml { render :xml => @#{self.class.name.sub(/Controller/,'').tableize} } n" "end n" "end n" end 课堂混合: class VendorOrdersController < ApplicationController # GET /vendor_orders # GET /vendor_orders.xml require 'controller_mixins' include ControllerMixin <rest of class> 所以我想在应用于VendorOrdersController时看到mixin的实现 更新:Per @?/我将字符串保存到一个变量中并将其放在一起.这样很好.这引起了我的代码中的错误(原因我想首先看到代码).下面的代码好多了,按预期工作. module ControllerMixin def self.included(mod) method_body = "def search_by_vendor n" " @#{mod.name.sub(/Controller/,'').tableize} = #{mod.name.sub(/Controller/,'')}.find_all_by_vendor_id(params[:vendor_id]) n" "respond_to do |format| n" " format.html { render :template=>'/#{mod.name.sub(/Controller/,:layout=>'vendor_info'} n" " format.xml { render :xml => @#{mod.name.sub(/Controller/,'').tableize} } n" "end n" "end n" puts method_body mod.class_eval(method_body) end end 解决方法
不,你不能得到一个方法的源代码.
最好的方法是使用Object#方法获取表示方法的Method对象.例如: m = VendorOrdersController.method(:search_by_vendor) 但是你会发现方法#名称,方法#arity,方法#source_location等没有什么. 在你的情况下,为什么不使用instance_eval将字符串存储在一个变量中,打印呢? 无论如何,您的instance_eval将在模块声明时执行.您可能希望将其包含在包含的回调中,以便在包含的时候执行它. module ControllerMixin def self.included(mod) mod.instance_eval([...]) end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |