【问题标题】:How to assign property values from method in Ruby如何从Ruby中的方法分配属性值
【发布时间】:2014-02-01 22:00:03
【问题描述】:

我有办法:

def mov destination_register, source
  if source == :ax then send("#{destination_register}=", @ax) end
end

其中 destination_register 是一个符号(:ax, :bxm :cx, :dx)。我也有属性:@ax、@bx、@cx、@dx。如果 source 始终是 :ax, :bx, :cx, :dx 之间的符号,我如何将 destination_register 属性的值与 source 的值一起分配?我尝试了发送,但我仍然不知道它是否会起作用。有什么建议吗?

【问题讨论】:

  • 没错。该方法是包含在具有 @ax 的类中的模块的一部分
  • 我很困惑。在您的问题中,您是说 source 是寄存器的名称,例如:ax 这意味着mov 将像mov(:ax, :bx) 一样使用,但在此评论中您是说mov 应该与一个值一起使用,例如mov(:ax, 2)
  • 我也对您的回复感到困惑,但我假设您的问题是正确的(即 source 是寄存器的符号)。我要删除我之前的评论。

标签: ruby methods properties variable-assignment send


【解决方案1】:

我不清楚你想做什么,但这样的事情可能会奏效:

def mov(destination_register, source)
  send(:"#{destination_register}=", instance_variable_get(:"@{source}"))
end

但是,如果您的实例变量有一个 getter 方法,那么使用它而不是直接获取实例变量会更好:

def mov(destination_register, source)
  send(:"#{destination_register}=", send(:"{source}"))
end

如果你想违反封装无论如何,那么为什么不走整个九码:

def mov(destination_register, source)
  instance_variable_set(:"#@{destination_register}", instance_variable_get(:"@{source}"))
end

【讨论】:

  • 我想这会奏效。我还想问:如何从传递给它的两个参数的对象调用 mov 方法?是否有这样一个版本的“发送”,它采用方法名称和两个参数,或者我只需要期待这个“*args”而不是两个位置参数?
  • send 采用方法名称以及您想要传递的许多参数。它只是将除第一个参数之外的所有参数传递给第一个参数命名的方法。
【解决方案2】:

以下应该有效:

def mov destination_register, source
  instance_variable_set(:"#{destination_register}", instance_variable_get(:"@{source}")
end

【讨论】:

    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2019-12-03
    相关资源
    最近更新 更多