企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 给类传递参数 有时对一个类的某些方面进行 **参数化**(**parameterize**)是很有用的。例如, 你可能需要管理不同版本的 gem 软件包,既可以为每一种版本创建分离的单独的类, 也可以使用继承和覆盖,为一个类传递一个版本号作为参数。 #### 操作步骤 1. 声明参数作为如下类定义的一部分: ``` class eventmachine( $version ) { package { "eventmachine": provider => gem, ensure => $version, } } ``` 2. 然后在一个节点上使用如下语法包含类: ``` class { "eventmachine": version => "0.12.8" } ``` #### 工作原理 类定义: ``` class eventmachine( $version ) { ``` 与普通的类定义一样,不同之处在于它携带了一个参数:$version。 在此类中,我们定义了如下的 package 资源: ``` package { "eventmachine": provider => gem, ensure => $version, } ``` 这是一个 gem 包资源,并且要求安装 $version 版本的软件包。 当你在一个节点上包含这个类时, 替换通常的语法: ``` include eventmachine ``` 为如下的 class 语句: ``` class { "eventmachine": version => "0.12.8" } ``` 这有相同的效果,只是同时为参数 $version 指定了一个值。 #### 更多用法 你可以为一个类指定多个参数: ``` class mysql( $package, $socket, $port ) { ``` 使用同样的方法为其传递参数值: ``` class { "mysql": package => "percona-sql-server-5.0", socket => "/var/run/mysqld/mysqld.sock", port => "3306", } ``` 你也可以为一些参数指定默认值: ``` class mysql( $package, $socket, $port = "3306" ) { ``` 或者使用如下代码片段为所有参数指定默认值: ``` class mysql( package = "percona-sql-server-5.0", socket = "/var/run/mysqld/mysqld.sock", port = "3306" ) { ``` 与 define 不同,一个节点上只能存在一个参数化的类实例。 所以当你需要针对一个资源创建多个不同的实例时,应该使用 define 取代类的参数化。 #### 参见本书 * 本章的 [使用节点继承](#ch04sec04) 一节 * 本章的 [使用类的继承和重载](#ch04sec05) 一节