- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
所有内容都在问题中说明。这两种方法都可以使用它们的代码名访问(读/写)实例变量:
__send__
instance_variable_set
instance_variable_get
有人可以举例说明吗?
当我们用抽象探索元编程时,它有时会融化我们的大脑。
=== 编辑 ===
好吧,我把答案的简历作为例子,如果我的大脑再次融化,以后可以使用。
类声明:
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def full_name
@first_name + ' ' + @last_name
end
end
初始化:
actor = Person.new('Donald', "Duck")
=> #<Person:0xa245554 @first_name="Donald", @last_name="Duck">
发送的用法(阅读):
actor.send('first_name')
=> "Donald"
actor.send(:first_name)
=> "Donald"
actor.send("last_name")
=> "Duck"
actor.send(:last_name)
=> "Duck"
actor.send('full_name')
=> "Donald Duck"
actor.send(:full_name)
=> "Donald Duck"
instance_variable_get 的用法(阅读)
actor.instance_variable_get('@first_name')
=> "Donald"
actor.instance_variable_get(:@first_name)
=> "Donald"
actor.instance_variable_get('@last_name')
=> "Duck"
actor.instance_variable_get(:@last_name)
=> "Duck"
使用发送(写):
actor.send('first_name=', 'Daisy')
actor.send('full_name')
=> "Daisy Duck"
actor.send(:first_name=, "Fifi")
actor.send("full_name")
=> "Fifi Duck"
instance_variable_set的使用(写入)
actor.instance_variable_set('@first_name', 'Pluto')
actor.send("full_name")
=> "Pluto Duck"
actor.instance_variable_set(:@last_name, 'Dog')
actor.send(:full_name)
=> "Pluto Dog"
instance_variable_get 的错误使用(阅读)
actor.instance_variable_get('full_name')
#NameError: `full_name' is not allowed as an instance variable name
actor.instance_variable_get('last_name')
#NameError: `last_name' is not allowed as an instance variable name
我对 Rails ActiveRecord 及其关联感到困惑。
感谢您的回答!
最佳答案
__send__
方法调用在您的类中定义的方法,如果未定义该方法则您不能使用 send
方法,但 instance_variable_get
和 set
方法无需任何封装方法(如 getter 或 setter)即可更改实例变量的值。
__send__
用于调用由符号标识的方法并在需要时传递任何参数。
例如
class Test
def sayHello(*args)
"Hello " + args.join(' ')
end
end
k = Test.new
k.send :sayHello, "readers" #=> "Hello readers"
instance_variable_get
返回给定实例变量的值,如果未设置实例变量则返回 nil。使用此方法无需封装
例如
class Test
def initialize(p1)
@a = p1
end
end
test = Test.new('animal')
test.instance_variable_get(:@a) #=> "animal"
instance_variable_set
用于设置实例变量的值,无需封装方法。例如
class Test
def initialize(p1)
@a = p1
end
end
test = Test.new('animal')
test.instance_variable_set(:@a, 'animal')
关于ruby - "__send__"和 "instance_variable_get/instance_variable_set"方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14477810/
我理解 some_instance.send 的概念,但我想弄清楚为什么您可以两种方式调用它。 Ruby Koans 暗示除了提供许多不同的方法来做同一件事之外还有一些原因。以下是两个用法示例: cl
我在 Ruby 中发现了一个奇怪的地方。当内核定义相同的方法时,使用 method_missing/respond_to_missing? 动态处理通过 __send__ 发起的方法调用失败: cla
所有内容都在问题中说明。这两种方法都可以使用它们的代码名访问(读/写)实例变量: __send__ instance_variable_set instance_variable_get 有人可以举例
如果我取消定义类上的所有实例方法,则会收到以下警告: warning: undefining `object_id' may cause serious problems warning: undef
我是一名优秀的程序员,十分优秀!