gpt4 book ai didi

ruby - "__send__"和 "instance_variable_get/instance_variable_set"方法有什么区别?

转载 作者:数据小太阳 更新时间:2023-10-29 07:56:36 25 4
gpt4 key购买 nike

所有内容都在问题中说明。这两种方法都可以使用它们的代码名访问(读/写)实例变量:

__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_getset 方法无需任何封装方法(如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com