【问题标题】:Ruby, run all methodsRuby,运行所有方法
【发布时间】:2023-03-16 14:47:01
【问题描述】:

是否可以运行并输出所有方法?不确定如何通过点运算符传递符号。所以应该是link.node而不是link.:node

require 'mechanize'

agent = Mechanize.new
page = agent.get("http://stackoverflow.com/")


link = page.link
p meth = link.methods #=> [:node, :href, :attributes, :page, :referer, :click, :dom_id, :dom_class, :pretty_print, :inspect, :rel, :rel?, :noreferrer?, :text, :to_s, :uri, :pretty_print_cycle, :pretty_print_instance_variables, :pretty_print_inspect, :nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :pretty_inspect, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]


   #this doesn't work.
    meth.each do |x|
      puts "#{x}: #{link.x}"
    end

【问题讨论】:

  • 其中许多方法都需要参数,没有它们就无法调用。你想完成什么?
  • 你在什么上运行这些方法?此外,现在它正在输出一个字符串,其中仅包含方法名称,后跟不带参数传递的方法。
  • 帮助我学习。方法是符号,不知道如何将符号推入点运算符....所以不要传递link.:node,应该是link.node

标签: ruby methods symbols


【解决方案1】:

如果要访问类的方法,可以使用以下方式

调用私有方法

meth.each { |x| puts "#{x}: #{link.class.send(x)}" }

调用公共方法

meth.each { |x| puts "#{x}: #{link.send(x)}" }

使用参数或参数调用方法

meth.each { |x| puts "#{x}: #{link.class.send(x, params_or_arguments)}" }
meth.each { |x| puts "#{x}: #{link.send(x, params_or_arguments)}" }

【讨论】:

    【解决方案2】:

    你可以使用send,但是正如cmets中指出的,很多方法都会有错误的arity:

    meth.each { |x| puts "#{x}: #{link.send(x)}" }
    

    顺便说一句:如果你想学习 Ruby,我写了一个你可能会感兴趣的 gem:methodfinder

    【讨论】:

    • 嗨 Micheal.. 我在这里回答是为了帮助(KS),而不是为了声誉.. 我不是 SOF 的频繁用户。我可以理解,所有这些都只是为了代表。希望,我没有伤害你……
    • @Jak 别担心,我不在乎,我发现开关有点奇怪,因为答案基本相同。无论如何,我又给了你一个 +1,并将删除之前的评论。希望我们以后会看到您在 SO 上更加活跃:-)
    • @Michal。你是大师..谢谢
    • 对不起,先生们,不知道该怎么办。新堆叠。 Jak 的回答更符合问题,但作为一个人,你的回答 Michael 对我来说更好。你有什么建议?
    • 保持原样 :-) 如有疑问,我同意“符合问题”的说法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多