我有一个班级:
class MyClass
def self.create_array
variable = ['one', 'two', 'three']
# I had:
# variable.each {|v| v.upcase}
# but want to do:
second_method(variable)
# or like this:
variable.second_method
# of course without parameter 'var' in second option
end
def second_method (var)
var.map {|v| v.upcase}
end
end
puts MyClass.create_array
# of course:
=> undefined method `second_method' for MyClass:Class (NoMethodError)
所以我只是想知道如何将second_method合并到第一个。
它只在我做的时候起作用:
class MyClass
def self.create_array
variable = ['one', 'two', 'three']
MyClass.second_method(variable)
end
def self.second_method (var)
var.map {|v| v.upcase}
end
end
puts MyClass.create_array
为什么它只在我上课时才能起作用?我想在我的变量上调用它。拜托,赐教!
在以下方法中创建方法是否有意义
class Array
def second_method
#content
end
end
答案 0 :(得分:0)
您已将second_method
定义为MyClass
上的实例方法,这意味着它只能在MyClass
的实例上调用 - 而不是在类本身上调用(这就是为什么第二个版本有效,您可以使用self.
运算符将两个方法定义为类方法。
要让现有代码生效,您可以在MyClass.new.second_method(variable)
内拨打self.create_array
。
答案 1 :(得分:0)
在Ruby中,只能从类方法调用类方法。当你在第一个片段中调用create_array
时,你无法从里面调用一个实例。
答案 2 :(得分:0)
与其他人指出的一样,类方法只能直接在类本身上调用。
这是你想要实现的吗?
class MyClass
attr_accessor :variable
def initialize
@variable = ['one', 'two', 'three']
second_method @variable
end
def second_method var
@variable = var.map {|v| v.upcase}
end
end
MyClass.new
#<MyClass:0x292fda0 @variable=["ONE", "TWO", "THREE"]>
或者你可以在实例化像这样的类
时将数组作为参数class MyClass
attr_accessor :variable
def initialize variable
@variable = variable
second_method @variable
end
def second_method var
@variable = var.map {|v| v.upcase}
end
end
MyClass.new ['one', 'two', 'three']
#<MyClass:0x292fda0 @variable=["ONE", "TWO", "THREE"]>