# 修改程序源码

为了充分理解本章节的内容，可以修改源码来尝试不同的结果。例如，可以修改location函数返回多个城市名称。

修改代码实验步骤

1. 打开dfx.json配置文件，修改默认的location\_hello设置为favorite\_cities

   这个步骤中，canister名称和主程序路径都要使用favorite\_cities
2. 保存并关闭dfx.json文件
3. 运行下面的命令复制location\_hello源文件目录来匹配dfx.json配置文件\
   \&#xNAN;**`cp -r src/location_hello src/favorite_cities`**
4. 打开src/favorite\_cities/main.mo文件
5. 复制粘贴下面的代码用2个新函数替换location函数

   ```
   actor {

     public func location(cities : [Text]) : async Text {
       return "Hello, from " # (debug_show cities) # "!";
     };

     public func location_pretty(cities : [Text]) : async Text {
       var str = "Hello from ";
       for (city in cities.vals()) {
         str := str # city #", ";
       };
       return str # "bon voyage!";
     }
   };
   ```

   注意代码中的Text被中括号包裹。在这里，Text代表UTF-8字符集。被中括号包裹的类型表示这是该类型的数组。在这里，\[Text]代表UTF-8字符集类型的数组，允许程序接收并返回多个字符串。

   对array使用apply操作的示例代码如下

   ```
   public func apply<A, B>(fs : [A -> B], xs : [A]) : [B] {
       var ys : [B] = [];
       for (f in fs.vals()) {
         ys := append<B>(ys, map<A, B>(f, xs));
       };
       ys;
   };
   ```

   想了解更多关于数组相关操作的内容，请查看Moto编程语言参考中的数组模块。在快速开始的示例部分也有数组使用的示例。
6. 运行下面的命令注册构建并部署应用

   ```
   dfx deploy
   ```
7. 运行下面的命令调用location方法并使用Candid接口描述规则传递city参数

   ```
   dfx canister call favorite_cities location '(vec {"San Francisco";"Paris";"Rome"})'
   ```

   命令使用Candid接口描述规则(vec { val1; val2; val3; }) 来返回一组值。需要更多关于Candid接口描述语言的信息，请查看Candid语言章节。

   命令输出示例：

   ```
   ("Hello, from ["San Francisco", "Paris", "Rome"]!")
   ```
8. 运行下面的命令调用location\_pretty方法并使用Candid接口描述规则传递city参数

   ```
   dfx canister call favorite_cities location_pretty '(vec {"San Francisco";"Paris";"Rome"})'
   ```

   命令输出：

   ```
   ("Hello from San Francisco, Paris, Rome, bon voyage!")
   ```
