2013-12-23 111 views
1

我想在控制檯讀取每行,然後將它們拆分爲" "如何從Ruby的控制檯輸出中讀取第3行?

在控制檯的輸出是:

List of devices attached 
0125Mt3B19ct7343 device 
07v6584d0a8a6cy7 device 

我想要得到的設備ID中的陣列,因爲我附上多個Android設備到USB集線器。

這是我迄今所做的:

class Init 

    $devices = Array.new 

    def getDevice 

    cmd = "adb devices" 
    value = `#{cmd}` 
    $deviceCount = value.lines.count 
    puts "#$deviceCount Devices are Connected to the USB Hub" 
    puts $deviceCount 
.......... 

    end 

上面的代碼是沒用的,因爲我無法獲得連接的設備的正確計數。我正在使用lines,因爲我無法弄清楚我還能使用什麼。

我想在終端讀取輸出並跳過第一行,即「附加設備列表」,然後拆分具有設備ID的以下行,以便將它們插入包含設備的數組中IDS。

例如:

devices[] = {0125Mt3B19ct7343, 07v6584d0a8a6cy7, ... } 

回答

2

這裏是你的代碼的一個未經測試的版本,寫多一點地道:

class Devices 

    @@devices = [] 

    def self.get_devices 
    @@devices = `adb devices`.split("\n")[1 .. -1] 
    device_count = @@devices.size 
    puts "#{ device_count } Devices are Connected to the USB Hub" 
    puts device_count 
    end 
end 

devices = Devices::get_devices 

事情要注意:

  • 不要命名一個類「Init」。一個班級應該是一件事,而不是一個行動。我冒昧地把它命名爲「設備」,這實際上是不正確的,因爲一個類應該是一個單一的事情,但在這種情況下,你正在尋找一個設備列表。 DeviceList可能是一個更好的名字。
  • $devices ......這是完全錯誤的。除非你明白全局的用途,否則不要使用全局。相反,使用類變量,例如Devices的類中的@@devices
  • Array.new是非常漂亮的,但沒有完成任何[]不爲此目的,所以使用更短,更簡潔的[]
  • def getDevice - 請勿將camelCase用於Ruby方法。按照慣例,方法和變量是snake_case,而Classes和Modules是camelCase。如果您打算髮布您的代碼或獲得編程Ruby或Rails的工作,請遵循約定。
  • split("\n")[1 .. -1]將從`adb devices`收到的輸出拆分爲單獨的行並將第二行返回到最後一行。這意味着您可以立即移除返回的「附加設備列表」行。

設計這些接口總是一種學習體驗。你可能希望能夠在最後的投票來獲得設備的當前列表,再加上有,現在獲取當前設備的另一種方法,並更新最後看到設備的變量:

class DeviceList 

    @@devices = [] 

    def self.get_devices 
    @@devices = `adb devices`.split("\n")[1 .. -1] 
    end 

    def self.device_list 
    get_devices() if @@devices.empty? 
    @@devices 
    end 

end 

devices = DeviceList::get_device_list 

device_count = devices.size 
puts "#{ device_count } Devices are Connected to the USB Hub" 
puts device_count 

這可以讓你請求當前列表使用Devices::device_list或使用Devices::get_devices強制重新加載列表。還要注意的是,這會從類中移除輸出並計算返回列表的大小。這些動作可以發生在一個類中,但是對於這種類型的代碼,我可能依賴於Ruby打印列表的能力,並使該類只返回設備列表。因人而異。

Stack Overflow上有很多聰明的人,他們可以幫助您使用正確的分類方法來爲方法等定義名稱。

+0

謝謝先生!我感謝您的幫助。這工作得很好。我只需要添加更多的東西,我會很好。再次感謝。 – napsterdsilva

+0

謝謝你的注意事項。我將關注指針。我很感激。 – napsterdsilva

+0

@napsterdsilva,歡迎來到Stack Overflow!如果這對你有幫助,你可以通過接受答案告訴社區(http://meta.stackexchange.com/a/5235)。 – falsetru