Ruby:从另一个需要属性的方法调用方法

Ruby:从另一个需要属性的方法调用方法,ruby,class,oop,methods,arguments,Ruby,Class,Oop,Methods,Arguments,基本上,我有两个方法和一个数组。我正在设置CLI界面。我有一个方法“call”,它通过其他方法运行。其中一种方法需要一个参数。所有这些方法都在同一个类中 class CLI array = ["test"] def method_2 method_1 end def method_1(array) puts array end end 我希望上面的输出数组。但是,当我调用类的新实例时,我得到了错误数量的参数。我不知道在哪里添加所需

基本上,我有两个方法和一个数组。我正在设置CLI界面。我有一个方法“call”,它通过其他方法运行。其中一种方法需要一个参数。所有这些方法都在同一个类中

class CLI

  array = ["test"]

  def method_2
    method_1
  end

  def method_1(array)
    puts array
  end

end
我希望上面的输出数组。但是,当我调用类的新实例时,我得到了错误数量的参数。我不知道在哪里添加所需的参数

谢谢你抽出时间


-M

我不清楚您想做什么,但听起来您希望至少有一个(或多个)方法打印出变量的当前值,但不希望在调用这些方法时将该变量作为参数传递给这些方法

您无法通过定义默认参数(例如
def method_1(array=['test'])
来实现这一点,因为在定义方法时,该默认参数只计算一次,并且该默认值将永远是首次定义方法时的值(不会更新)

因此,请将代码改为如下:

class CLI
@@数组=[“测试”]
def方法2
方法1
结束
def方法_1
放置@数组
结束
结束
@
前缀表示一个类变量:该类的所有实例都将共享该变量的相同值。然后确保
@@@array
的值保持最新。您可能希望重新设计程序,但除了样式和最佳做法之外,您还有一个答案


通常的做法是在调用时将参数传递给
method\u 1
,但是如果希望
method\u 2
调用
method\u 1
,而不希望将其作为参数传递给
method\u 2
,那么您就没有选择了(这就是为什么我说您可能需要重新设计界面的原因).

通常在面向对象设计中,您封装了作用于对象中数据的数据和方法。在Ruby中,您使用实例变量创建对象的属性:

class CLI
  def initialize(array = [])
    @array = []
  end

  def method_2
    method_1
  end

  def method_1
    puts @array
  end
end

cli = CLI.new(["Hello", "World"])
cli.method2  
class CLI
  @array = ["Hello", "World"]

  def self.hello
    puts @array.join(" ")
  end

  def you_cant_access_it_from_an_instance
    @array
  end
end

CLI.hello # Hello World
CLI.new.you_cant_access_it_from_an_instance # nil
实例变量使用sigil
@
。它们被认为是私有的,因为即使Ruby没有对实例变量使用
private
关键字,它们的作用域也局限于实例

类也可以有实例变量:

class CLI
  def initialize(array = [])
    @array = []
  end

  def method_2
    method_1
  end

  def method_1
    puts @array
  end
end

cli = CLI.new(["Hello", "World"])
cli.method2  
class CLI
  @array = ["Hello", "World"]

  def self.hello
    puts @array.join(" ")
  end

  def you_cant_access_it_from_an_instance
    @array
  end
end

CLI.hello # Hello World
CLI.new.you_cant_access_it_from_an_instance # nil
这是一个“类”实例变量,它属于类本身-它不与子类共享。这是因为在Ruby类中是对象-类的实例

Ruby还具有类变量,这些变量在类及其所有Decedent之间共享:

class Foo

  @@array = ["Hello", "World"]
    
  def self.hello
    puts @@array.join(" ")
  end

  def self.array=(val)
    @@array = val
  end
end

class Bar < Foo; end
Bar.array = ['Oh', 'noes']
Foo.hello # Oh noes

method_1
需要一个参数,因此您在
method_2
中调用
method_1
是错误的。您想做什么?我有几个方法需要从“method_2”调用,但我需要先找出如何调用一个方法。我希望method_2调用method_1,并让method_1显示数组(或任何其他变量)
array=[“test”]
应该是什么?常数?实例变量?类变量?只是一个字符串作为占位符。对不起,我是新手。我不认为这很重要。